2014-03-13 10 views
34

Ich bin neu in xUnit.net und AutoFixture.Unterschied zwischen Fakt und Theorie? - xUnit.net

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

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

Können Sie mir bitte sagen, ob die folgenden zwei Teile des Codes gleich sind? Ich frage das, weil der Test mit beiden gelingt, aber ich will 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 ist die Schlüsselwörter [Fact] und [Theory].

Ich gehe davon aus, dass die [Theory] Keywords sagt der xUnit.net-Framework, dass die gelieferten Daten von irgendwo kommt, wo irgendwo Autoftixture ist. Wohingegen [Fact] XUnit nichts über den Ursprung der Daten sagt und ich die Objekte manuell erstellen muss.

Antwort

45

Unter der Annahme, dass Ihr [AutoMoqData] Attribut etwas wie folgt aussieht:

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

Dann ja, diese beiden Tests gleichwertig sind.

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

Das Attribut [Fact] wird vom xUnit.net-Test-Runner verwendet, um einen "normalen" Komponententest zu identifizieren: eine Testmethode, die keine Methodenargumente annimmt.

Das Attribut erwartet andererseits, dass eine oder mehrere DataAttribute Instanzen die Werte für die Methodenargumente eines Parameterized Test liefern.

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

AutoFixture hooks in diesen Erweiterungspunkt von xUnit.net, indem das Attribut [AutoData] bereitgestellt wird. Es kann verwendet werden, um Tests deklarativer zu machen.

+0

Danke für die Erklärung! Ja, mein AutoMoqData-Attribut sieht wie Ihres aus. BTW: Ich mag Ihre "Dependency Injection" in .NET Book und mein "Testproject" baut darauf auf! – sternze

+0

Sollte der Code nicht 'DataAttribute' heißen? –

+0

@ BjörnAliGoransson Nein,' AutoDataAttribute' ist in * AutoFixture.XUnit * und definiert * AutoFixture.XUnit2 *. –