Différence entre les faits et la théorie? - xUnit.net

je suis nouveau à xUnit.net et AutoFixture.

je travaille actuellement sur un "projet test" 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 me dire si les deux codes suivants sont égaux? Je demande cela parce que le Test réussit avec les deux, mais je veux apprendre le droit 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 xUnit.net cadre que les données fournies proviennent de quelque part, où quelque part est Autofixture. Alors que les [Fact] ne dit rien à xUnit sur l'origine des données et je dois construire les objets manuellement.

41
demandé sur svick 2014-03-13 12:44:10

1 réponses

en Supposant que votre [AutoMoqData] l'attribut ressemble à quelque chose comme ceci:

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

Ensuite, oui, ces deux tests sont équivalents.

[Fact] et [Theory] les attributs sont définis par xUnit.net.

[Fact] l'attribut est utilisé par le xUnit.net lanceur de test pour identifier un niveau "normal" de l'unité de test: une méthode de test qui ne prend pas d'arguments de méthode.

[Theory] l'attribut, de l'autre, s'attend à un ou plusieurs DataAttribute instances pour fournir les valeurs pour un Test Paramétré's des arguments de méthode.

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

des crochets D'AutoFixture dans ce point d'extensibilité de xUnit.net en fournissant le [AutoData] l'attribut. Il peut être utilisé pour rendre les tests plus déclaratifs.

56
répondu Mark Seemann 2014-03-13 09:01:33