国产探花免费观看_亚洲丰满少妇自慰呻吟_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ā)表
主站蜘蛛池模板: 论坛| 沙雅县| 班戈县| 建瓯市| 庆元县| 廊坊市| 武威市| 浠水县| 吉林省| 江永县| 临西县| 青阳县| 远安县| 惠州市| 曲周县| 肇源县| 手游| 竹山县| 凌云县| 临汾市| 岫岩| 兰溪市| 黎川县| 四川省| 镇平县| 平乡县| 静安区| 南岸区| 永德县| 偏关县| 天台县| 婺源县| 浙江省| 缙云县| 天祝| 庆云县| 静宁县| 剑川县| 高安市| 梁河县| 革吉县|