事实与理论的区别

我是 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 数据的起源,我需要手动构建对象。

66017 次浏览

Assuming that your [AutoMoqData] attribute looks something like this:

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

Then, yes, those two tests are equivalent.

Both [Fact] and [Theory] attributes are defined by xUnit.net.

The [Fact] attribute is used by the xUnit.net test runner to identify a 'normal' unit test: a test method that takes no method arguments.

The [Theory] attribute, on the other, expects one or more DataAttribute instances to supply the values for a Parameterized Test's method arguments.

xUnit.net itself supplies various attributes that derive from DataAttribute: [InlineData], [ClassData], [PropertyData].

AutoFixture hooks into this extensibility point of xUnit.net by supplying the [AutoData] attribute. It can be used to make tests more declarative.

Facts are tests which are always true. They test invariant conditions.

Theories are tests which are only true for a particular set of data.

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