2011-06-02 33 views
6

Tengo un repositorio con un método Add que se lleva a un IEnumerable como parámetro:verificar el método ha sido llamado con IEnumerable que contiene elementos de 'x' con Moq

public void Add<T>(T item) where T : class, new(){} 

En un unittest Quiero comprobar que este método es llama con un IEnumerable que contiene exactamente la misma cantidad de elementos como otro IEnumerable

[Test] 
public void InvoicesAreGeneratedForAllStudents() 
{ 
    var students = StudentStub.GetStudents(); 
    session.Setup(x => x.All<Student>()).Returns(students.AsQueryable()); 

    service.GenerateInvoices(Payments.Jaar, DateTime.Now); 

    session.Verify(x => x.Add(It.Is<IEnumerable<Invoice>>(
     invoices => invoices.Count() == students.Count()))); 
} 

el resultado de la prueba de unidad:

Moq.MockException : 
Expected invocation on the mock at least once, but was never performed: 

x => x.Add<Invoice>(It.Is<IEnumerable`1>(i => i.Count<Invoice>() == 10)) 

No setups configured. 

¿Qué estoy haciendo mal?

Respuesta

3

Desde su ejemplo de código que no han establecido la x => x.Add en el Moq

session.Setup(x => x.Add(It.IsAny<IEnumerable>()); 

A menos que el programa de instalación de x.All está destinado a ser x.Add? Si es así, debe coincidir exactamente con Verificar y Configurar - una buena forma de hacerlo es extraerlo a un método común que devuelve una Expresión.

EDITAR: Agregué una muestra, he cambiado la firma de Agregar porque no puedo ver cómo podría pasar una colección de lo contrario.

[TestClass] 
public class UnitTest1 
{ 
    [TestMethod] 
    public void TestMethod1() 
    { 
     Mock<Boo> moqBoo = new Mock<Boo>(); 
     moqBoo.Setup(IEnumerableHasExpectedNumberOfElements(10)); 

     // ACT 

     moqBoo.Verify(IEnumerableHasExpectedNumberOfElements(10)); 
    } 

    private static Expression<Action<Boo>> IEnumerableHasExpectedNumberOfElements(int expectedNumberOfElements) 
    { 
     return b => b.Add(It.Is<IEnumerable<Invoice>>(ie => ie.Count() == expectedNumberOfElements)); 
    } 
} 

public class Boo 
{ 
    public void Add<T>(IEnumerable<T> item) where T : class, new() 
    { 
    } 
} 

public class Invoice 
{ 

} 

Además, una buena forma de depurar estas cosas es configurar el Mock con MockBehavior.Strict y luego se le informará por el código invocado lo que necesita configurar.

Cuestiones relacionadas