AutoFixture is a .NET library to automatically generate test data. To use it install the following packages
AutoFixture
AutoFixture.Xunit2
AutoFixture.AutoMoq
Inyecting with AutoData
You can create the fixtures either manually or automatically. I do it automatically with [AutoData]
test class
public class AnimalControllerTests
{
private readonly Mock<AnimalService> _serviceMock;
private readonly AnimalController _sut;
public AnimalControllerTests()
{
_serviceMock = new Mock<AnimalService>();
_sut = new AnimalController(_serviceMock.Object);
}
}
test method example
[Theory, AutoData]
public async Task Animal_Process_IsCorrectlyCreated(Animal animal, Guid guid)
{
// when calling this test, Animal and Guid have already been inyected
// ARRANGE
_serviceMock.Setup(x => x.Create(animal))
.Returns(guid);
// ACT
var resultGuid = await _sut.Process(animal);
// ASSERT
_serviceMock.Verify(m => m.Create(animal));
resultGuid.Should().Be(guid);
}
Custom values with InlineAutoData
It’s possible to set a custom value and automatically fill the rest from left to right.
[Theory]
[InlineAutoData("jose ramón")]
public async Task Animal_Process_IsCorrectlyCreated(string name, Animal animal, Guid guid)
{
// ARRANGE
animal.Name = name;
_serviceMock.Setup(x => x.Create(animal))
.Returns(guid);
// ACT
var resultGuid = await _sut.Process(animal);
// ASSERT
_serviceMock.Verify(m => m.Create(animal));
resultGuid.Should().Be(guid);
}
AutoMoqData
We create this custom attribute to combine auto-mocking and auto-generation
public class AutoMoqDataAttribute : AutoDataAttribute
{
public AutoMoqDataAttribute() : base(new Fixture().Customize(new AutoMoqCustomization()))
{
}
}
Now we don't need the constructor. We can just remove all the clutter and use the mocked service and class directly.
[Theory, AutoMoqData]
public async Task Animal_Process_IsCorrectlyCreated([Frozen] Mock<AnimalService> _serviceMock, AnimalController _sut, Animal animal, Guid guid)
{
// ARRANGE
animal.Name = name;
_serviceMock.Setup(x => x.Create(animal))
.Returns(guid);
// ACT
var resultGuid = await _sut.Process(animal);
// ASSERT
_serviceMock.Verify(m => m.Create(animal));
resultGuid.Should().Be(guid);
}