考虑下面的测试,它确认当一个对象被添加到HttpContentConatiner
类时,它产生的MD5(存储在内容容器上)与外部序列化和散列body内容的结果相匹配(这就是它的使用方式)。
[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);
}
我宁愿同时模拟哈希器和序列化器。
Reason -这些依赖项的Hash
和Serialize
方法都可以被假设执行期望的功能,这可以是Mock的期望。测试失败将明确地指示被测对象的失败。