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
{
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" }]
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í:
Con esta modificación, el test debería pasar como se espera.