c# - 在测试方法中如何使用模拟参数或实例参数?

标签 c# unit-testing mocking moq stub

在测试方法中传递对象参数的最佳实践是什么? 在这种情况下使用什么?(模拟、 stub 或创建对象实例并填充它)

例如:

[Test]
public void LoadContentsFor_ValidUser_ReturnsEmptyList()
{
    var user = new User {Id = 1, FirstName = "Test"};
    var contents = this.contentPresentationService.LoadContentsFor(user);
    Assert.IsTrue(contents.Count == 0);
}

或者使用模拟:

[Test]
public void LoadContentsFor_ValidUser_ReturnsEmptyList()
{
    var user = new Mock<User>();
    user.Setup(x => x.Id).Returns(1);
    user.Setup(x => x.FirstName).Returns("Test");
    var contents = this.contentPresentationService.LoadContentsFor(user.Object);
    Assert.IsTrue(contents.Count == 0);
}

最佳答案

如果是这个简单的对象,我建议手动创建它或使用一些构建工具,例如 AutoFixture NBuilder (这两个库都是为了解决您所询问的确切问题而设计的):

// AutoFixture example
var fixture = new Fixture();
var user = fixture
    .Build<User>()
    .With(u => u.Id, 1)
    .With(u => u.FirstName, "John")
    .CreateAnynomous();

除此之外,AutoFixture 还提供了许多更有用的功能,例如

  • 自动生成属性数据
  • 跳过不需要的属性
  • 用自动模拟替换某些属性(给AutoMoq看看)

模拟框架不提供的功能,因为它们扮演不同的角色。当然,如果您仍然继续使用模拟,什么也不会发生,但考虑到它们前面提到的不同目的,对于代码的读者来说可能会感到困惑

关于c# - 在测试方法中如何使用模拟参数或实例参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13267799/

相关文章:

c# - .NET 的 Equals 方法的真正含义是什么?

c# - 将 Batch shell 脚本输出读入 C# .Net 程序

android - 在 Android 测试中模拟 FingerprintManager

c++ - 使用升压测试和不应编译的测试的最佳实践

python - 我是否在 Django 测试中 mock 这个辅助函数?

c# - 如何在运行时动态应用 wpf 数据绑定(bind)

c# - 通过方法将现有的 IEnumerable<int> 转换为字符串 (#,#,#,..)

javascript - 与上下文无关的 JavaScript 测试框架

java - 我怎样才能 "intercept"一个方法调用进行测试?

java - 捕获先前的值以验证模拟对象