手动设置模拟还是让AutoFixture返回预期结果?

时间:2018-08-10 16:47:02

标签: autofixture

我是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);
}

我相信这两种方法的最终产品都是相同的,但是对于每种方法何时有意义,是否有最佳实践或指导原则?

谢谢。

0 个答案:

没有答案