2016-09-08 46 views
0

我對如何正確地模擬一個對象有點困惑。從我在NSubstitute的例子中看到的,這是assert的基本設置。我的理解是關於測試方法的行爲。我的問題如下:與NSubstitute嘲笑,需要一些清晰。

  1. 這是模擬獲取設備主機名的正確方法。

    [TestMethod] 
    public void MockedDeviceHostName() 
    { 
        //Arrange 
        var device = Substitute.For<IDeviceLogic>(); 
        Device mockedDevice = new Device();  
    
        //Act 
        device.GetHostName("IP Address","Object Identifier Repository","CommunityString").Returns(mockedDevice.hostName); 
    
        //Assert 
        Assert.AreEqual(mockedDevice.hostName, device.GetHostName("IP Address", "Object Identifier Repository", "CommunityString")); 
    
    } 
    
  2. 嘲笑的優點是什麼。我當然明白這是基於行爲的測試,我的意思是,我設定了行爲期望值,所以我覺得即使在這種情況下方法有錯誤,他們也總是正確的。我正在尋找一些關於嘲笑與單元測試和集成測試的清晰度。

回答

0

Mocking通常用於替換類/對象的依賴關係,以便可以獨立於該依賴關係來測試其邏輯。

在你的例子中,沒有真正依賴嘲笑IDeviceLogic的課。更接近的例子可能是需要顯示關於設備的信息的表單。在這種情況下,如果不附加真實設備,就可以運行表單邏輯的基本測試。的這個

[Test] 
public void SetDeviceNameOnLoad() { 
    //Arrange 
    var device = Substitute.For<IDeviceLogic>(); 
    var view = Substitute.For<IDeviceView>(); 
    var form = new DevicePresenter(device, deviceView); 
    device.GetHostName("IP Address","Object Identifier Repository","CommunityString").Returns("sample device name"); 

    //Act 
    form.Load(); 

    //Assert 
    Assert.AreEqual("sample device name", view.DeviceName); 
} 

一個優點是我們可以隔離我們想要從瞬態條件測試一些邏輯(例如,設備可以被斷開,網絡可以是向下等)。我們還可以模擬難以可靠自動化測試的條件(例如,我們模擬返回特定HTTP狀態代碼的Web服務)。我們可以加快測試速度(例如,一臺設備可能需要30秒才能連接 - 我們可以嘲笑它來模擬立即連接)。

缺點是我們只模擬依賴關係 - 如果真實情況的行爲不同,我們的測試比無用的測試更糟糕。例如,如果您在主機名變爲可用之前必須在實際設備上調用device.Connect(),那麼您的模擬不會在沒有額外工作的情況下共享此行爲。

希望這會有所幫助。

+0

謝謝:)這真的有助於:) – Mdukes00