Tokiota Blog

Agiliza la escritura de tests con AutoFixture

Hector Escalante

Al escribir tests generalmente creamos objetos que representan el estado inicial y en algunas ocasiones crear estos objetos y sus dependencias se puede convertir en una tarea compleja, terminamos escribiendo código que no es relevante para el test. Para optimizar esta tarea podemos apoyarnos en la librería AutoFixture cuyo principal beneficio es la creación de valores aleatorios e instancias con un mínimo esfuerzo.

Instalación

Añadimos el paquete AutoFixture.Xunit2 a nuestro proyecto de pruebas.

Ejemplo

Teniendo el siguiente test:

[Theory]
[MemberData(nameof(Data))]
public void GivenNewDelivery_WhenDeliver_ThenAllProductsWereDelivered(List< AmazonProduct> products)
{
    //Arrange
    var sut = new AmazonDelivery(products);

    //Act
    sut.Deliver();

    //Assert
    Assert.NotEmpty(sut.Products);
    Assert.Equal(sut.Products.Count, sut.DeliveredProducts);
}

public static IEnumerable<object[]> Data()
{
    return new List<object[]>
    {
        new object[] { 
            new List< AmazonProduct>() 
            { 
                new AmazonProduct(123, "How to Cook the Perfect Paella", "Books", (decimal)34.00),
                new AmazonProduct(456, "Best Cities to Live in Spain", "Books", (decimal)48.00),
                new AmazonProduct(789, "Learn Catalan in 21 days", "Audio CDs", (decimal)26.00)
            }
        }
    };
}

Podemos simplificarlo utilizando el atributo AutoData de AutoFixture para crear el SUT:

  
[Theory, AutoData]
public void GivenNewDelivery_WhenDeliver__ThenAllProductsWereDelivered(AmazonDelivery sut)
{
    //Act
    sut.Deliver();

    //Assert
    Assert.NotEmpty(sut.Products);
    Assert.Equal(sut.Products.Count, sut.DeliveredProducts);
}

Hemos reducido drásticamente el código necesario ya que el método Data no es necesario porque AutoFixture se encarga de llenar las propiedades con valores aleatorios.

Una ventaja adicional es que nuestros tests son más tolerantes a los cambios en nuestro código y AutoFixture se encarga de resolver las dependencias de nuestras clases, de esta forma aunque cambiemos el constructor de la clase, el código del test seguirá funcionando sin necesidad de modificarlo.

Más Información

También se integra con NUnit y tiene soporte para generar mocks a través de Moq y otras librerías. Puedes obtener más información revisando la documentación.

Espero que este pequeño artículo te sea de utilidad y que puedas agilizar la escritura de tus tests. 😉👍👍

Hector Escalante
Escrito por:

Hector Escalante

Development & Cloud Consultant

Compartelo por: