gpt4 book ai didi

c# - 为了最小化测试范围内的单元,我是否应该在单元测试时始终使用 Mocks

转载 作者:行者123 更新时间:2023-11-30 17:55:06 24 4
gpt4 key购买 nike

考虑以下测试,它确认当一个对象被添加到 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);
}

最佳答案

我更愿意 Mock Hasher 和 Serializer。

原因 - 这些依赖项的 HashSerialize 方法都可以假设执行预期的功能,这可能是 Mock 的期望。测试失败则表明被测对象确实失败。

关于c# - 为了最小化测试范围内的单元,我是否应该在单元测试时始终使用 Mocks,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15337805/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com