我是TDD的新手,我最近开始将Autofixture与NSubstitute一起使用。我发现自己一直在质疑我是否应该手动设置[Frozen]模拟或是否冻结期望的结果并让Autofixture自动为我返回。
例如,如果我手动进行:
[Theory, AutoDomainData]
public async Task GetStuffAsync_should_return_expected_stuff([Frozen]User user, [Frozen]Office office, [Frozen] IMyDependency myDependency, MySut sut)
{
//-- Arrange
user.A = office.A;
user.B= new List<string> {office.B};
// Setup mock
myDependency.GetStuff(Arg.Is(office.A), Arg.Is(office.B)).Returns(office.Stuff);
//-- Act
var result = await sut.GetStuffAsync(user);
//-- Assert
result.Stuff.Should().BeEquivalentTo(office.Stuff);
}
与让AutoFixture处理它相反。
[Theory, AutoDomainData]
public async Task GetStuffAsync_should_return_expected_stuff([Frozen]User user, [Frozen]Stuff expectedStuff, MySut sut)
{
//-- Arrange
// nothing to arrange because Autofixture automatically returns stuff
//-- Act
var result = await sut.GetStuffAsync(user);
//-- Assert
result.Stuff.Should().BeEquivalentTo(expectedStuff);
}
在寻求帮助时,我偶然发现了另一种组合方法。让AutoFixture创建期望的对象,并按照here所示设置模拟。看起来像这样:
[Theory, AutoDomainData]
public async Task GetStuffAsync_should_return_expected_stuff([Frozen]User user, Stuff expected, [Frozen] IMyDependency myDependency, MySut sut)
{
//-- Arrange
// Setup mock
myDependency.GetStuff(Arg.Any<string>, Arg.Any<string>).Returns(expected);
//-- Act
var result = await sut.GetStuffAsync(user);
//-- Assert
result.Stuff.Should().BeEquivalentTo(expected);
}
我相信这两种方法的最终产品都是相同的,但是对于每种方法何时有意义,是否有最佳实践或指导原则?
谢谢。