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

ste*_*nze 60 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));
}
Run Code Online (Sandbox Code Playgroud)

[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));
}
Run Code Online (Sandbox Code Playgroud)

是什么让我认为关键词[Fact]和关键词存在差异[Theory].

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

Mar*_*ann 75

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

public class AutoMoqDataAttribute : AutoDataAttribute
{
    internal AutoMoqDataAttribute()
        : base(new Fixture().Customize(new AutoMoqCustomization()))
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,是的,这两个测试是等价的.

两者[Fact][Theory]属性都由xUnit.net定义.

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

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

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

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

  • 只是我发现条款不明确吗?他们是`测试`,但对我来说,'Fact`和`Theory`是非常不同的.你可能会测试一个理论,但不是一个事实......不知道...语言是否很难...... (3认同)
  • @Noctis 说实话,我也发现术语“事实”和“理论”有些做作,但这是 *xUnit.net* 团队做出的命名选择...... (3认同)
  • 感谢您的解释!是的,我的AutoMoqData属性看起来像您的。顺便说一句:我喜欢您的“ .NET Book中的依赖注入,而我的“ Testproject”是基于它的! (2认同)

小智 12

事实是永远正确的测试。他们测试不变条件。

理论是仅适用于一组特定数据的测试。

来源:https://xunit.net/docs/getting-started/netfx/visual-studio