es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Mocking XUnit, pasando y afirmando una colección.

Nuevo en XUnit y tratando de probar el siguiente método pero la prueba falla. Creo que la razón es que se crea una nueva instancia de los datos cuando se llama al assert. Por lo tanto, aunque los resultados sean los mismos, la referencia del objeto no lo es.

Cuando se agrega un nuevo registro a la colección, se supone que se devuelve el mismo registro agregado.

Clase Employee Data:

public class EmployeeData
{
public int Id { get; set; }
public string LastName { get; set; }
public string FirstName { get; set; }
public string Title { get; set; }
}

Método a probar:

public List Add(List employees)
{
foreach(var employee in employees)
{
data.Add(new EmployeeData() { Id = newId(),
FirstName = employee.FirstName, LastName = employee.LastName,
Title = employee.Title });
}
return data;
}

Método de prueba:

[Hecho]
public void Add()
{
// Arreglo
var data = new List();
data.Add(new EmployeeData() { Id = 1, FirstName = "Adams", LastName = "John", Title = "Fireman" });

// Fingiendo los argumentos del constructor de la clase de empleado.
var mockLogging = new Mock<ILogger<DataService>>();
var mockConfig = new Mock<IConfiguration>();
var sut = new Employee(mockLogging.Object, mockConfig.Object);

var result = sut.Add(data);

// La afirmación debería devolver los mismos datos insertados
Assert.Equal(result, data);

}

Resultado de la prueba:

Mensaje:
Error en Assert.Equal()
Esperado: List<EmployeeData> [EmployeeData { FirstName = "Adams", Id = 1, LastName = "John", Title = "Fireman" }]
Actual: List<EmployeeData> [EmployeeData { FirstName = "Adams", Id = 1, LastName = "John", Title = "Fireman" }]

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Explicación del test fallido en XUnit

    El objetivo del test es verificar que cuando se agrega un nuevo registro a la colección, se devuelve el mismo registro. Sin embargo, el test falla aunque los resultados esperados y reales son los mismos.

    La razón del fallo es que se crea una nueva instancia de los datos cuando se llama al assert. Por lo tanto, aunque los resultados sean los mismos, la referencia del objeto no lo es.

    Para solucionar el test, podemos comparar el contenido de las dos listas en lugar de comparar sus referencias de objeto. Podemos usar el método SequenceEqual para comparar los elementos de las listas.

    La afirmación modificada se vería así:

    Assert.True(result.SequenceEqual(data));

    Esto comparará los elementos en ambas listas y devolverá true si son iguales.

    El método de prueba actualizado se vería así:

    [Hecho]
    public void Agregar()
    {
        // Organizar
        var data = new List<employeedata>();
    
        data.Add(new EmployeeData() { Id = 1, Nombre = "Adams", Apellido = "John", Título = "Bombero" });
    
        // Simulación de los argumentos del constructor de la clase Employee.
        var mockLogging = new Mock<><dataservice>>();
        var mockConfig = new Mock<iconfiguration>();
        var sut = new Employee(mockLogging.Object, mockConfig.Object);
    
        var result = sut.Add(data);
    
        // Assert debería devolver la entrada de datos exacta
        Assert.True(result.SequenceEqual(data));
    }
    

    Con esta modificación, el test debería pasar como se espera.

Comments are closed.