最近在看.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,這個類所生成的對象就是一個樁對象,樁對象的目的是為了替換測試中的依賴項,有些時候,依賴項可能需要文件或某些配置,導致很難測試,所以,為了方便測試,我們使用了樁對象。
上面的例子中,我們通過接口完成了對象間的依賴解除,再通過屬性完成對接口的賦值,如果不使用屬性,我們還可以用別的方法對接口進行賦值。
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é),寫一下如何使用框架進行測試,畢竟寫樁對象還是要花很多時間的。
新聞熱點
疑難解答