Разница между фактом и теорией? - 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 ничего о происхождении данных, и мне нужно создать объекты вручную.
Ответы
Ответ 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]
. Его можно использовать, чтобы сделать тесты более декларативными.