2013-03-11 80 views
3

考慮以下測試這證實了當對象被添加到HttpContentConatiner類它所得MD5,其被存儲在內容容器上的結果相匹配從外部序列化和散列主體內容(這將如何使用)。我應該總是使用嘲笑當用於最小化單元在測試範圍起見單元測試

[Fact] 
public void When_body_added_correctly_MD5_matches_an_external_hash_of_the_same_content() 
{ 
    var contentStub = new object(); 
    var serializer = new NewtonSoftJsonSerializer(); 
    var hasher = new Hmac256Hasher(); 
    var contentContainer = new HttpContentContainer(serializer, hasher); 

    contentContainer.AddBody(contentStub); 

    Assert.Equal(hasher.Hash(serializer.Serialize(contentStub), "Key"), 
          contentContainer.ContentMD5.Value); 

} 

在這個測試中,我使用的串行和散列器,而不是嘲笑了這兩個對象都實際實現。現在,這意味着測試依賴於散列器和串行作爲其實現現在已經駛進了測試範圍,我擔心可能使我的測試脆正常工作兩者。

我的問題
鑑於上面的例子中,我應該嘲笑爲維護目的,串行和散列器還是確定依賴於這樣的外部服務?

基於答案新代碼:

[Fact] 
public void When_a_valid_body_is_added_ContentMD5_Value_is_populated() 
{ 
    var serializerMock = new Mock<ISerializer>(); 
    serializerMock.Setup(serializer => serializer.Serialize(It.IsAny<object>())) 
        .Returns("serializedContent"); 

    var hasherMock = new Mock<IHasher>(); 
    hasherMock.Setup(hasher => hasher.Hash(It.IsAny<string>(), It.IsAny<string())) 
       .Returns("MD5"); 

    var contentContainer = 
     new HttpContentContainer(serializerMock.Object, hasherMock.Object); 

    contentContainer.AddBody(new object()); 

    Assert.NotEmpty(contentContainer.ContentMD5.Value); 
} 

回答

1

我寧願嘲笑兩個散列器和串行器。

原因 - 這兩個HashSerialize這些依賴關係的方法可以假定執行預期的功能,這可以是模擬的期望。然後測試失敗將確定地表明被測對象的失敗。

+0

這將是一個單獨的測試,這種測試並不證明內容是有,但證明該實施正確地散列所述內容並把它放在其用於散列上轉移到HTTP報頭中的正確的屬性一個http請求。 – McDonnellDean 2013-03-11 12:03:26

+0

嗯,測試你的對象是'HttpContentContainer'。但你的描述包括:測試'HttpContentContainer','Hmac256Hasher'和'NewtonSoftJsonSerializer'。我不會在一個單元測試中測試3個類的動作。 – 2013-03-11 12:10:41

+0

這不是3個動作。有一個單元測試'HttpContentContainer.ContentMD5.Value'。填充此只讀屬性的唯一方法是通過AddBody方法添加一個值。測試是完全有效的,這個問題與維護這些測試有關。 – McDonnellDean 2013-03-11 12:22:04