在测试方法中传递对象参数的最佳实践是什么? 在这种情况下使用什么?(模拟、 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/