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

C# 为了最小化测试范围内的单元,我是否应该在单元测试时始终使用mock,c#,unit-testing,mocking,moq,xunit,C#,Unit Testing,Mocking,Moq,Xunit,考虑以下测试,该测试确认当对象添加到HttpContentConatiner类时,其结果MD5(存储在内容容器上)与外部序列化和散列正文内容的结果相匹配(这是如何使用的) 在这个测试中,我为序列化程序和哈希程序使用了一个实际的实现,而不是模拟这两个对象。这意味着测试依赖于哈希程序和序列化程序的正常工作,因为它们的实现现在已经被拉入测试范围,我担心这可能会使我的测试变得脆弱 我的问题 在上面的例子中,为了可维护性,我应该模拟序列化程序和哈希程序,还是可以依赖这样的外部服务 基于答案的新代码: [F

考虑以下测试,该测试确认当对象添加到
HttpContentConatiner
类时,其结果MD5(存储在内容容器上)与外部序列化和散列正文内容的结果相匹配(这是如何使用的)

在这个测试中,我为序列化程序和哈希程序使用了一个实际的实现,而不是模拟这两个对象。这意味着测试依赖于哈希程序和序列化程序的正常工作,因为它们的实现现在已经被拉入测试范围,我担心这可能会使我的测试变得脆弱

我的问题
在上面的例子中,为了可维护性,我应该模拟序列化程序和哈希程序,还是可以依赖这样的外部服务

基于答案的新代码:

[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);
}
[事实]
当\u a\u有效\u正文\u已添加\u内容md5\u值\u已填充时的公共无效()
{
var serializerMock=new Mock();
serializerMock.Setup(serializer=>serializer.Serialize(It.IsAny()))
.返回(“序列化内容”);
var hasherMock=new Mock();

Setup(hasher=>hasher.Hash(It.IsAny(),It.IsAny我更喜欢模拟hasher和序列化程序


原因-可以假设这些依赖项的
散列
序列化
方法都可以执行预期的功能,这可能是模拟的预期。测试失败将表明测试对象确实失败。

这将是一个单独的测试,此测试不是为了证明内容是t这里只是为了证明实现正确地散列了内容,并将其放置在正确的属性中,该属性用于在http请求中将散列传输到http头中。嗯,您正在测试的对象是
HttpContentContainer
。但是您描述的内容涉及测试
HttpContentContainer
Hmac256Hasher
and
NewtonSoftJsonSerializer
。我不会在一个单元测试中测试3个类的操作。它不是3个操作。有一个单元要测试
HttpContentContainer.ContentMD5.Value
。填充此只读属性的唯一方法是通过AddBody方法添加一个值。测试完全有效,问题涉及ma此类测试的目的。我已标记为正确。我与另一位我认识的人进行了交谈,他同意你的观点。我已经在哈希器上进行了哈希相等测试,所以实际上我应该只测试值是否存在。完成后,我将使用新测试进行更新。谢谢!
[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);
}