Unterschied zwischen Fakt und Theorie? - xUnit.net

73

Ich bin neu bei xUnit.net und AutoFixture.

Ich arbeite derzeit an einem "Testprojekt", um mich mit xUnit.net und Autofixture vertraut zu machen. Es gibt eine Kleinigkeit, die ich nicht verstehe.

Was ist der Unterschied zwischen [Fact]und [Theory, AutoMoqData]?

Könnten Sie mir bitte sagen, ob die folgenden zwei Codeteile gleich sind? Ich frage dies, weil der Test mit beiden erfolgreich ist, aber ich möchte es richtig lernen.

[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));
}

und

[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));
}

Was mich denken lässt, dass es einen Unterschied gibt, sind die Schlüsselwörter [Fact]und [Theory].

Ich gehe davon aus, dass die [Theory]Schlüsselwörter dem xUnit.net-Framework mitteilen, dass die bereitgestellten Daten von irgendwoher stammen, wo sich irgendwo Autofixture befindet. Während [Fact]xUnit nichts über den Ursprung der Daten sagt und ich die Objekte manuell erstellen muss.

Sternze
quelle
3
Kurze Antwort : Fakt ist eine parameterlose Theorie.
Shadi Namrouti

Antworten:

86

Angenommen, Ihr [AutoMoqData]Attribut sieht ungefähr so ​​aus:

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

Dann ja , sind diese beiden Tests gleichwertig.

Beide [Fact]und [Theory]Attribute werden von xUnit.net definiert.

Das [Fact]Attribut wird vom xUnit.net-Testläufer verwendet, um einen "normalen" Komponententest zu identifizieren: eine Testmethode, die keine Methodenargumente akzeptiert.

Das [Theory]Attribut erwartet andererseits, dass eine oder mehrere DataAttributeInstanzen die Werte für die Methodenargumente eines parametrisierten Tests liefern .

xUnit.net selbst liefert verschiedene Attribute , die aus ableiten DataAttribute: [InlineData], [ClassData], [PropertyData].

AutoFixture wird durch Angabe des [AutoData]Attributs in diesen Erweiterungspunkt von xUnit.net eingebunden . Es kann verwendet werden, um Tests deklarativer zu gestalten.

Mark Seemann
quelle
2
Danke für die Erklärung! Ja, mein AutoMoqData-Attribut sieht aus wie deins. Übrigens: Ich mag Ihre "Dependency Injection in .NET Book und mein" Testproject "baut darauf auf!
Sternze
@ BjörnAliGöransson Nein, AutoDataAttributeist in AutoFixture.XUnit und AutoFixture.XUnit2 definiert .
Mark Seemann
3
Ist es nur ich, der die Begriffe nicht klar findet? sie sind Tests, aber für mich sind a Factund a Theorysehr unterschiedlich. Sie könnten eine Theorie testen, aber keine Tatsache ... keine Ahnung ... Sprache ist har d ...
Noctis
1
@ Noctis Um ehrlich zu sein, finde ich auch die Begriffe Tatsache und Theorie etwas erfunden, aber das ist die Namenswahl, die das xUnit.net- Team getroffen hat ...
Mark Seemann