web-dev-qa-db-fra.com

Différence entre fait et théorie? - xUnit.net

Je suis nouveau sur xUnit.net et AutoFixture.

Je travaille actuellement sur un "testproject" pour me familiariser avec xUnit.net et Autofixture. Il y a une petite chose que je ne comprends pas.

Quelle est la différence entre [Fact] et [Theory, AutoMoqData]?

Pourriez-vous s'il vous plaît me dire si les deux morceaux de code suivants sont égaux? Je pose cette question parce que le test réussit avec les deux, mais je veux l'apprendre de la bonne façon.

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

et

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

Ce qui me fait penser qu'il y a une différence, ce sont les mots clés [Fact] et [Theory].

Je suppose que le [Theory] Les mots clés indiquent au framework xUnit.net que les données fournies proviennent de quelque part, où quelque part est Autofixture. Tandis que [Fact] ne dit rien à xUnit sur l'origine des données et j'ai besoin de construire les objets manuellement.

58
sternze

En supposant que votre attribut [AutoMoqData] Ressemble à ceci:

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

Alors, oui , ces deux tests sont équivalents.

Les attributs [Fact] Et [Theory] Sont définis par xUnit.net.

L'attribut [Fact] Est utilisé par le lanceur de test xUnit.net pour identifier un test unitaire "normal": une méthode de test qui ne prend aucun argument de méthode.

L'attribut [Theory], D'autre part, s'attend à ce qu'une ou plusieurs instances DataAttribute fournissent les valeurs des arguments de méthode Test paramétré .

xUnit.net lui-même fournit divers attributs qui dérivent de DataAttribute: [InlineData], [ClassData], [PropertyData].

AutoFixture se connecte à ce point d'extensibilité de xUnit.net en fournissant l'attribut [AutoData]. Il peut être utilisé pour rendre les tests plus déclaratifs.

74
Mark Seemann