2013-05-15 47 views

回答

2

在做單元測試,你必須創建嘲笑或存根爲你的所有外部依賴內C#的Visual Studio 2010單元測試。一個可以幫助你的框架是Moq(如果你想探索的話,這裏有很多模擬框架)。

這些模擬或存根(stub)只是提供必要的交互和數據以通過測試的外牆。

如果您提供有關該不可用設備的更多詳細信息,我們可能會提供更多幫助。

+0

他試圖單元測試的方法存在依賴性。他需要構建他的代碼,以便他可以通過注入或其他方式解決該依賴關係,如果他計劃使其可測試。 – Pete

1

有可能是一個更好的辦法,但一次或兩次,我已經在這個情況下一個方法調用另一個複雜的方法,並把一個可選的參數在你測試樣

public void DoSomething(int number, bool skipMethod= false) 
{ 
    if(!skipMethod) 
     MethodThatWillBreak(); 
{ 
的方法結束

因此,在運行的正常情況下,它會被罰款,但在你的單元測試,你可以做

DoSomething(2,true); 

但實際上,它表明你需要做你的代碼的一些重構,因爲你的單元測試只應該擊中一個「單位」。如果您可以在不調用MethodThatWillBreak的情況下測試該方法,那麼它首先在那裏做什麼。

+1

語義稍微偏離這裏。應該將callMethod重命名爲跳過方法,就像你寫的那樣。 – Pete

+0

好吧,先生 –

0

要正確測試單元,您應該從要測試的類中去除與設備的通信。抽象出實現接口的另一個類中的設備部分,將通信類注入到被測對象的ctor中,現在可以從外部注入模擬實現並避免錯誤,mmock實現還可以記錄對其進行的調用或以預定義的方式進行緩解測試。 讀取依賴注入和控制反轉

0

通常,您將從您正在測試的類中提取外部依賴關係,並在您的單元測試中將它們與假模式交換。我們建議您查看Inversion of Control以及許多Mocking Frameworks(Moq,Rhino Mocks等)中的一個

4

如果您是單元測試與外部依賴性的一類,則必須使用在注入接口隔離外部的依賴關係

interface IDevice 
{ 
    void Run(); 
} 

interface IDeviceOperator 
{ 
    void Operate(); 
} 

class DeviceOperator : IDeviceOperator 
{ 
    private readonly IDevice _device; 

    public DeviceOperator(IDevice device) 
    { 
     _device = device; 
    } 

    public void Operate() 
    { 
     _device.Run(); 

     // test other stuff here 
    } 
} 

[TestFixture] 
public class DeviceOperatorTests 
{ 
    [Test] 
    public void Test_DeviceOperator_Operate() 
    { 
     IDevice device = A.Fake<IDevice>(); // Using FakeItEasy 3rd party mocking framework syntax 
     DeviceOperator deviceOperator = new DeviceOperator(device); 

     deviceOperator.Operate(); 
    } 
} 
1

退房Working Effectively with Legacy Code本書由邁克爾·羽毛 - 它有很多的建議,在處理那些沒有單位代碼測試呢。

在本書可能的方法:在界面

  • 提取物的依賴 - 理想的方法(見jamespconnor的答案)
  • 使用標誌繞過電話(見科爾姆Prunty的答案)
  • 提取物,調入在單元測試中使用的派生類中的虛方法和覆蓋
  • 通過代表(可能比全接口/派生更小的影響)

樣品從類派生:

public class WithComplexDependency 
{ 
    public void DoSomething() 
    { 
    // Extract original code into a virtual protected method 
    // dependency.MethodThatWillBreak(); 
    CallMethodThatWillBreak(); 
    } 

    virtual protected void CallMethodThatWillBreak() 
    { 
     dependency.MethodThatWillBreak(); 
    } 
} 

在測試代碼從類派生,並提供自己的實現:

public class WithMockComplexDependency : WithComplexDependency 
{ 
    // may also need to add constructor to call original one. 

    override protected void CallMethodThatWillBreak() 
    { 
     // do whatever is needed for your test 
    } 
} 

... 
WithComplexDependency testObject = new WithMockComplexDependency(); 
testObject.DoSomething(); // now does not call dependency.MethodThatWillBreak() 
... 
0

你可能不希望跳過外部。相反,您想要隔離外部依賴項,例如訪問外部設備。有很多方法可以做到這一點 a。您可以使用第三部分隔離框架,如Moq或RhinoMock等。 b。您可以使用Moles框架(因爲您使用的是VS2010) - 將.NET方法替換爲代表 http://research.microsoft.com/en-us/projects/moles/ c。付費隔離框架,如TypeMock。 d。或者乾脆使用手寫的虛假實現來使用接口,並且您的測試使用假實現。

相關問題