AutoFixture (AutoData & AutoMoq)

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