Подтвердить что ты не робот

Разница между фактом и теорией? - xUnit.net

Я новичок в xUnit.net и AutoFixture.

В настоящее время я работаю над "testproject", чтобы ознакомиться с xUnit.net и Autofixture. Есть одна маленькая вещь, которую я не понимаю.

В чем разница между [Fact] и [Theory, AutoMoqData]?

Не могли бы вы рассказать мне, равны ли следующие две части кода? Я спрашиваю об этом, потому что тест успешно работает с обоими, но я хочу узнать его правильно.

[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 ничего о происхождении данных, и мне нужно создать объекты вручную.

4b9b3361

Ответ 1

Предполагая, что ваш атрибут [AutoMoqData] выглядит примерно так:

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

Затем, да, эти два теста эквивалентны.

Оба атрибута [Fact] и [Theory] определяются xUnit.net.

Атрибут [Fact] используется тестовым бегуном xUnit.net для определения "нормального" unit test: тестового метода, который не принимает аргументов метода.

Атрибут [Theory], с другой стороны, ожидает, что один или несколько экземпляров DataAttribute будут предоставлять значения аргументов метода Parameterized Test.

xUnit.net сам поставляет различные атрибуты, полученные из DataAttribute: [InlineData], [ClassData], [PropertyData].

AutoFixture перехватывает эту точку расширяемости xUnit.net, поставляя атрибут [AutoData]. Его можно использовать, чтобы сделать тесты более декларативными.