2012-11-17 45 views
3

我要嘗試TDD,我正在爲此研究正確的工具。 在工作中,我們使用MS Fakes,所以不用更改它,並使用MS Fakes和TDD。 但我有一個嚴重的問題。在我看來,那MS假貨意在場景中使用:寫代碼 - 它>寫單元測試。我怎樣才能嘲笑一些接口在TDD與MS假貨?TDD與MS Fakes

例如我有以下的一個文件代碼(重構將在稍後完成)

[TestClass] 
public class MyTests 
{ 
    [TestMethod] 
    public void ShouldReturnSomeResultIfEmptyCollectionOfCustomersWasReturned() 
    { 
     // arrange 
     ICustomerRepository customerRepository = null; 
     var targetService = new MyTargetService(customerRepository); 

     // act 
     int result = targetService.MyMethod(); 

     // assert 
     Assert.AreEqual(1, result); 

    } 
} 

public class MyTargetService : IMyTargetService 
{ 
    private readonly ICustomerRepository customerRepository; 

    public MyTargetService(ICustomerRepository customerRepository) 
    { 
     this.customerRepository = customerRepository; 
    } 

    public int MyMethod() 
    { 
     if (customerRepository.GetCustomers().Any()) 
     { 
      return 0; 
     } 

     return 1; 
    } 
} 

public interface IMyTargetService 
{ 
} 

public interface ICustomerRepository 
{ 
    Customer[] GetCustomers(); 
} 

public class Customer 
{ 
} 

在我的TDD過程中,我把一切都放在一個文件,然後將重構這個並移動到不同組件。但我需要在這個地方模擬內嵌ICustomerRepository customerRepository = null;。例如,我可以用NSubstitute輕鬆做到這一點。但是如果我使用MS Fakes,我需要首先將此接口移動到另一個項目,從單元測試所在的位置引用此項目,然後按「添加僞裝配」。這似乎是非常複雜的工作流程,這使得TDD不那麼快速和高效。 我想有這樣的代碼只是不到位所有那些奇怪的操作:

ICustomerRepository customerRepository = new StubBase<ICustomerRepository> 
       { 
        GetCustomers =() => Enumerable.Empty<Customer>().ToArray(), 
       }; 

StubBase<>是抽象的。那麼有沒有辦法用MS Fakes來做這樣的事情呢?

+0

我在代碼之前編寫測試。經過幾次迭代測試 - >代碼 - >重構後,我發佈了結果代碼。 –

+0

抱歉,誤會 –

回答

1

假貨依賴於編譯時代碼生成,目前需要你定義的接口/你想在一個單獨的項目來存根類。與其他在運行時生成存根的框架(如NSubstitute)相比,在編譯新測試之前,需要一個額外的重構步驟 - 將剛剛創建的新界面從測試項目移動到目標項目。使用Resharper只需幾次擊鍵即可完成重構。

4

在開始火焰戰爭的風險,這已經從微軟套件中的大多數測試工具如此。簡答:使用這些工具時,您應該對是否要使用這些工具做出明智的決定。如果你選擇是的話,你必須遵守MS對TDD或單元測試的定義 - 即使它看起來是違反直覺的。

  • 編碼UI需要您在開始編寫測試之前生成UI的映射。這要求您在開始編寫腳本測試之前完成用戶界面的完成。
  • MSTest的力量你寫的是不能分享的測試狀態,即使它們屬於同一個測試夾具(昂貴創建)。這意味着昂貴的設置必須反覆運行以保持測試獨立/並行友好。
  • 通過PEX,MS承諾通過自動生成測試用例對已編寫代碼進行測試覆蓋。然而,這與TDD無關。

MS Fakes似乎指示您需要右鍵單擊包含您的接口的程序集並生成Fakes程序集。然後學習命名約定(這對我來說看起來有點奇怪),並將lambda表達式或委託映射到可能由您的代碼執行的每個接口成員。我對由此產生的測試不可讀/重構友好保持警惕。

對於您有一個抽象層(界面)背後的依賴性推薦的情況下,像犀牛,起訂量,NSubstitute通常的嫌疑人沒有在你的方式獲得工作的罰款。 我唯一能找到的是MS Fakes的地方是使用遺留代碼或第三方代碼,在那裏你沒有訪問源來解耦/注入依賴關係。在這種情況下,MS假貨可能會有用。

1

我不推薦使用MS Fakes。它會阻礙你的進行,並導致你編寫糟糕的測試,並迫使你使用xml文件。這對於TDD來說不是一個好的測試框架時期。 Roy Osherove會爲此擔保,他在書中做過。

讓事情簡單吧? MS Fakes會導致你並要求你做相反的事情,如果你使用了這個工具,你最終會陷入混亂。