私はxUnit.netとAutoFixtureが初めてです。
現在、xUnit.netとAutofixtureに慣れるために「テストプロジェクト」に取り組んでいます。わからないことが1つあります。
違いは何ですか [Fact]
および[Theory, AutoMoqData]
?
次の2つのコードが等しいかどうか教えてください。テストは両方で成功するため、私はこれを求めていますが、私はそれを正しい方法で学びたいです。
[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にデータの出所について何も伝えず、オブジェクトを手動で作成する必要があります。
[AutoMoqData]
属性が次のようになっていると仮定します。
public class AutoMoqDataAttribute : AutoDataAttribute
{
internal AutoMoqDataAttribute()
: base(new Fixture().Customize(new AutoMoqCustomization()))
{
}
}
次に、yes、これらの2つのテストは同等です。
[Fact]
属性と[Theory]
属性の両方がxUnit.netによって定義されています。
[Fact]
属性は、xUnit.netテストランナーが「通常の」単体テスト(メソッド引数を受け取らないテストメソッド)を識別するために使用されます。
一方、[Theory]
属性は、1つ以上のDataAttribute
インスタンスが Parameterized Test のメソッド引数の値を提供することを期待します。
xUnit.net自体は、DataAttribute
から派生するさまざまな属性を提供します:[InlineData]
、[ClassData]
、[PropertyData]
。
AutoFixtureは、[AutoData]
属性を提供することにより、xUnit.netのこの拡張ポイントにフックします。テストをより宣言的にするために使用できます。