在大多時候代碼的測試很難,因為很多代碼無法進行參數注入,那么這個時候有一款不受限的隔離框架TypeMock供你使用,不過遺憾這款軟件是付費的一個隔離框架,有15天的免費使用權,如果能解決你現有的問題我想這份費用并不能算多。TypeMock的官方下載http://www.typemock.com/。下面開始看看TypeMock是怎么樣使用的。
1:偽造一個靜態的方法來看一個例子
被測試的靜態方法
public static int DoSomethingSpecialOnALeapYear() { if ((DateTime.Now.Month == 3) && (DateTime.Now.Day == 29)) return 100; return 0; }
測試方法
1 [TestMethod, Isolated]2 public void FakingDateTime()3 {4 Isolate.WhenCalled(() => DateTime.Now).WillReturn(new DateTime(2016, 3, 29));//當調用當前時間的時候會返回指定的時間5 int result = MyStatic.DoSomethingSpecialOnALeapYear();6 Assert.AreEqual(100, result);7 }
2:偽造一個sealed的類
被測試的靜態方法
1 public static bool SignedIn { get; set; } 2 3 public static bool SignOut(HttpContext current) 4 { 5 if (SignedIn) 6 { 7 HttpsessionState session = current.Session; 8 session.Abandon(); 9 return true;10 }11 return false;12 }
如果我們要保證上面的方法能不在依賴HttpContext 那么我們必須要注入這個依賴我們看測試代碼
1 [TestMethod, Isolated]2 public void FakingHttpContext()3 {4 var fakeHttp = Isolate.Fake.Instance<HttpContext>();//需要注入的偽對象5 MyStatic.SignedIn = true;6 var result = MyStatic.SignOut(fakeHttp);7 Assert.AreEqual(true, result);8 }
3:重寫偽造類中的方法
如果一些類現在要按照我們的需要來返回相應的值我們來看看下面這個例子
1 public static bool IsMySiteNameTypemock(PRocess process)2 {3 var name = process.MachineName;4 if (process.MainModule.Site.Name.StartsWith("Typemock"))5 return true;6 else7 return false;8 }
為了上面的程序正常工作那么我們必須需要通過site.Name以Typemock開始所以在測試中我們必須這么做
1 [TestMethod, Isolated]2 public void SetBehaviorOnChainExample()3 {4 var fake = Isolate.Fake.Instance<Process>();5 Isolate.WhenCalled(() => fake.MainModule.Site.Name).WillReturn("Typemock rocks");//設置Site.Name6 var result = MyStatic.IsMySiteNameTypemock(fake);7 Assert.AreEqual(true, result);8 }
現在我們來運行測試一下看看結果
4:跳過某一個異常的方法
如果在一個方法體中要先執行一個方法(一個依賴項)然后在執行后面的代碼下面我們在來看這個例子
1 public class Dependency//一個依賴項2 {3 public virtual void CheckSecurity(string name, string passWord)4 {5 throw new SecurityException();6 }7 }
1 public int Calculate(int a, int b, Dependency dependency)2 {3 dependency.CheckSecurity("typemock", "rules");4 return a + b;5 }
然后我們進行需要跳過CheckSecurity這個會報異常的方法來看看例子
1 [TestMethod, Isolated]2 public void FakeMethod_OnLiveObject() {3 var dependency = new Dependency();4 Isolate.WhenCalled(() => dependency.CheckSecurity(null, null)).IgnoreCall();//不去管這個方法的調用5 var classUnderTest = new ClassUnderTest();6 var result = classUnderTest.Calculate(1, 2, dependency);7 Assert.AreEqual(3, result);8 }
5:在未來某個方法體中創建偽對象
比喻在一個放法A中我們會依賴一個B類那么這個在內部實例化的那么我們該怎么辦呢??聪旅孢@個例子
這個外部的依賴項依然是上面的Dependency。
現在我們來修改Calculate這個方法體如下
1 public static int Calculate(int a, int b) {2 var dependency = new Dependency();3 dependency.CheckSecurity("typemock", "rules");4 return a + b;5 }
我們在Calculator中直接去實例化Dependency這個對象了。
那么我們來看看怎么去注入這個偽對象
1 [TestMethod, Isolated]2 public void FakeConstructor() {3 var fakeHandle = Isolate.Fake.NextInstance<Dependency>();//不需要注入在未來進行創建的偽對象4 var result = ClassUnderTest.Calculate(1, 2);5 Assert.AreEqual(3, result);6 }
我們采用了NextInstance這個表示在未來的某個方法體中去創建這個偽對象。ok我們來看下測試的效果
上面就簡單介紹了一個typemock的基本用法。
新聞熱點
疑難解答