オブジェクトが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);
}
このテストでは、これら2つのオブジェクトをモックアウトするのではなく、シリアライザーとハッシャーの両方に実際の実装を使用します。これは、実装がテストスコープに取り込まれたため、テストが正常に機能しているハッシャーとシリアライザーの両方に依存していることを意味します。これにより、テストが脆弱になる可能性があります。
私の質問
上記の例を考えると、保守性の目的でシリアライザーとハッシャーをモックする必要がありますか、それともこのような外部サービスに依存しても大丈夫ですか?
回答に基づく新しいコード:
[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);
}