事实与理论的区别? - xUnit.net

时间:2014-03-13 08:44:10

标签: c# xunit.net autofixture

我是xUnit.net和AutoFixture的新手。

我目前正在研究"测试项目"熟悉xUnit.net和Autofixture。 有一件事我不明白。

[Fact][Theory, AutoMoqData]之间的区别是什么?

请告诉我以下两段代码是否相同? 我问这个是因为测试成功了,但我想以正确的方式学习。

[Fact]
public void UpdateVersionWillUpdateCorrectlyInRepository()
{
    var fixture = new Fixture().Customize(new AutoMoqCustomization());
    var contract = fixture.Create<VersionContract>();
    var version = fixture.Create<Version>();

    fixture.Freeze<Mock<IContractMapper>>()
        .Setup(r => r.Map(contract)).Returns(version);

    var repMock = fixture.Freeze<Mock<VersionRepository>>();

    var sut = fixture.Create<VersionManagementService>();

    sut.UpdateVersion(contract);

    repMock.Verify(r => r.UpdateVersion(version));
}

[Theory, AutoMoqData]
public void UpdateVersionWillUpdateCorrectlyInRepository(
    VersionContract contract,
    Version version,
    [Frozen]Mock<IContractMapper> mapMock,
    [Frozen]Mock<VersionRepository> repMock,
    VersionManagementService sut)
{
    mapMock.Setup(r => r.Map(contract)).Returns(version);

    sut.UpdateVersion(contract);

    repMock.Verify(r => r.UpdateVersion(version));
}

是什么让我认为关键字[Fact][Theory]存在差异。

我假设[Theory]关键字告诉xUnit.net框架提供的数据来自某处,其中某处是Autofixture。而[Fact]告诉xUnit没有关于数据的来源,我需要手动构建对象。

1 个答案:

答案 0 :(得分:67)

假设您的[AutoMoqData]属性如下所示:

public class AutoMoqDataAttribute : AutoDataAttribute
{
    internal AutoMoqDataAttribute()
        : base(new Fixture().Customize(new AutoMoqCustomization()))
    {
    }
}

然后,,这两项测试是等效的。

[Fact][Theory]属性均由xUnit.net定义。

xUnit.net测试运行器使用[Fact]属性来标识“正常”单元测试:不带方法参数的测试方法。

另一方面,[Theory]属性需要一个或多个DataAttribute实例提供Parameterized Test方法参数的值。

xUnit.net本身提供源自DataAttribute的各种属性:[InlineData][ClassData][PropertyData]

AutoFixture通过提供[AutoData]属性挂钩到xUnit.net的这个可扩展点。它可以用来使测试更具说明性。