我是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没有关于数据的来源,我需要手动构建对象。
答案 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的这个可扩展点。它可以用来使测试更具说明性。