国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發(fā)設計 > 正文

.net單元測試——解除依賴

2019-11-15 02:28:32
字體:
供稿:網(wǎng)友

.net單元測試——解除依賴

最近在看.net單元測試藝術,我也喜歡單元測試,這里寫一下如何在測試中解除對象間的依賴。

假如有這樣的一個需求,當用戶登陸時,我需要對用戶名和密碼進行驗證,然后再將用戶名寫入日志中。

  public class MyLogin    {        public bool Valid(string userName, string passWord)        {            var isValid = userName == "admin" && passWord == "123456";            WriteLog(userName);            return isValid;        }        PRivate void WriteLog(string message)        {            //....寫入數(shù)據(jù)庫或文件中        }}

上面代碼中,如果我們寫單元測試時會發(fā)現(xiàn),WriteLog方法依賴于文件或數(shù)據(jù)庫時,這時測試會比較困難一些。首先我們需要對解除依賴,再進行測試。代碼如下:

public class MyLogin    {        public ILog Log { get; set; }        public bool Valid(string userName, string passWord)        {            var isValid = userName == "admin" && passWord == "123456";            Log.Write(userName);            return isValid;        }    }    public interface ILog    {        void Write(string message);    }

  這時我們引入了ILog接口,在調(diào)用Valid方法前,需要對屬于Log進行賦值,這里,我們便解除了對象之間的依賴。我們開始寫單元測試,測試中,我們需要自己模擬一個樁對象。

    樁對象是對系統(tǒng)中現(xiàn)有依賴項的一個替代品,可人為控制,通過使用樁對象,無需涉及依賴項,即可直接對代碼進行測試。

  測試框架這里我選用了NUnit框架。測試代碼如下:

[TestFixture]    public class MyLoginTest    {        [Test]        public void Vaild_Test()        {            MyLogin login = new MyLogin();            login.Log = new TestLog();             var isLogin = login.Valid("admin", "123456");            Assert.AreEqual(isLogin, true);        }    }    public class TestLog : ILog    {        public void Write(string message)        {            //nothing        }    }

  這里我定義了一個類TestLog,這個類所生成的對象就是一個樁對象,樁對象的目的是為了替換測試中的依賴項,有些時候,依賴項可能需要文件或某些配置,導致很難測試,所以,為了方便測試,我們使用了樁對象。

  上面的例子中,我們通過接口完成了對象間的依賴解除,再通過屬性完成對接口的賦值,如果不使用屬性,我們還可以用別的方法對接口進行賦值。

  1. 通過構(gòu)造函數(shù)進行賦值。
public MyLogin(ILog log)  Log = log;

在測試中,初始化Mylgoin對象時,把樁對象傳給構(gòu)造函數(shù)即可。

  2. 通過工廠模式進行賦值。

  通過工廠類來生成ILog對象,并且工廠類要允許傳入ILog對象,代碼如下:

public class MyLogin    {        public bool Valid(string userName, string passWord)        {            var isValid = userName == "admin" && passWord == "123456";            var log = Factory.CreateLog();            log.Write(userName);            return isValid;        }    }    public interface ILog    {        void Write(string message);    }    public class Factory    {        private static ILog iLog;        public static ILog CreateLog()        {            return iLog;        }        public static void SetLog(ILog log)        {            iLog = log;        } }

  測試類中,要對Factory的SetLog方法進行賦值,其它操作基本不變。

  3. 使用虛方法或IOC容器。

  這些操作需要根據(jù)實際情況去使用。不要因為測試去改變你的設計(過度測試),除非你的設計無法測試。

  總結(jié): 對于開發(fā)人員來講,單元測試是很重要一項工作。它會讓你的代碼結(jié)構(gòu)更加清晰,代碼的可讀性也會更好。下一節(jié),寫一下如何使用框架進行測試,畢竟寫樁對象還是要花很多時間的。


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 喜德县| 介休市| 高州市| 内乡县| 松潘县| 绥棱县| 历史| 双桥区| 鞍山市| 长葛市| 道孚县| 宁陵县| 福建省| 大竹县| 沙坪坝区| 武功县| 淄博市| 观塘区| 府谷县| 宣威市| 奉新县| 巴林右旗| 铁岭县| 泗水县| 赫章县| 施秉县| 溧阳市| 永康市| 永安市| 建昌县| 肥乡县| 武安市| 民乐县| 墨玉县| 巴里| 三原县| 炎陵县| 民丰县| 衢州市| 安龙县| 日土县|