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


73

我是xUnit.net和AutoFixture的新手。

我目前正在研究“ testproject”以熟悉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并没有告诉任何有关数据源的信息,因此我需要手动构建对象。


3
简短答案:事实是一种无参数理论。
Shadi Namrouti

Answers:


87

假设您的[AutoMoqData]属性看起来像这样:

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

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

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

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

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

xUnit.net本身提供从获得各种属性DataAttribute[InlineData][ClassData][PropertyData]

通过提供[AutoData]属性,AutoFixture可以连接到xUnit.net的此扩展点。它可以使测试更具说明性。


2
感谢您的解释!是的,我的AutoMoqData属性看起来像您的。顺便说一句:我喜欢您的“ .NET Book中的依赖注入,而我的“ Testproject”是基于它的!
sternze 2014年

@BjörnAliGöransson不,AutoDataAttributeAutoFixture.XUnitAutoFixture.XUnit2中定义。
Mark Seemann

3
只是我发现术语不清楚?它们是Tests,但对我而言aFact和aTheory有很大不同。您可能会考验理论,但不能考验事实……不知道……语言很困难……
Noctis

1
@Noctis老实说,我也发现事实理论这两个术语有些虚构,但这是xUnit.net团队做出的命名选择……
Mark Seemann
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.