web-dev-qa-db-ja.com

事実と理論の違いは? -xUnit.net

私は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にデータの出所について何も伝えず、オブジェクトを手動で作成する必要があります。

58
sternze

[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のこの拡張ポイントにフックします。テストをより宣言的にするために使用できます。

74
Mark Seemann