關於遺留代碼的測試

    在大多時候代碼的測試很難,由於不少代碼沒法進行參數注入,那麼這個時候有一款不受限的隔離框架TypeMock供你使用,不過遺憾這款軟件是付費的一個隔離框架,有15天的無償使用權,若是能解決你現有的問題我想這份費用並不能算多。TypeMock的官方下載http://www.typemock.com/。下面開始看看TypeMock是怎麼樣使用的。session

1:僞造一個靜態的方法來看一個例子框架

被測試的靜態方法ide

public static int DoSomethingSpecialOnALeapYear()
        {
            if ((DateTime.Now.Month == 3) && (DateTime.Now.Day == 29))
                return 100;
            return 0;
        }
DoSomethingSpecialOnALeapYear

測試方法測試

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         }
FakingDateTime

2:僞造一個sealed的類spa

被測試的靜態方法3d

 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         }
SignOut

若是咱們要保證上面的方法能不在依賴HttpContext 那麼咱們必需要注入這個依賴咱們看測試代碼code

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         }
FakingHttpContext

3:重寫僞造類中的方法對象

若是一些類如今要按照咱們的須要來返回相應的值咱們來看看下面這個例子blog

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             else
7                 return false;
8         }
IsMySiteNameTypemock

爲了上面的程序正常工做那麼咱們必須須要經過site.Name以Typemock開始因此在測試中咱們必須這麼作ci

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.Name
6             var result = MyStatic.IsMySiteNameTypemock(fake);
7             Assert.AreEqual(true, result);
8         }
SetBehaviorOnChainExample

如今咱們來運行測試一下看看結果

4:跳過某一個異常的方法

若是在一個方法體中要先執行一個方法(一個依賴項)而後在執行後面的代碼下面咱們在來看這個例子

1 public class Dependency//一個依賴項
2     {
3         public virtual void CheckSecurity(string name, string password)
4         {
5             throw new SecurityException();
6         }
7     }
Dependency
1 public int Calculate(int a, int b, Dependency dependency)
2         {
3             dependency.CheckSecurity("typemock", "rules");
4             return a + b;
5         }
Calculate

而後咱們進行須要跳過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         }
FakeMethod_OnLiveObject

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         }
Calculate

咱們在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         }
FakeConstructor

咱們採用了NextInstance這個表示在將來的某個方法體中去建立這個僞對象。ok咱們來看下測試的效果

上面就簡單介紹了一個typemock的基本用法。

相關文章
相關標籤/搜索