Метод проверки вызван с IEnumerable, содержащим элементы 'x' с Moq - PullRequest
7 голосов
/ 02 июня 2011

У меня есть репозиторий с методом Add, который принимает IEnumerable в качестве параметра:

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

В unittest я хочу убедиться, что этот метод вызывается с IEnumerable, который содержит точно такое же количество элементовкак другой 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())));
 }

Результат модульного теста:

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.

Что я делаю не так?

1 Ответ

4 голосов
/ 02 июня 2011

Из вашего примера кода вы не настроили x => x.Add на Moq

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

Если не указано, что установка для x.All должна быть x.Add? Если это так, вам нужно точно подобрать параметры Verify and Setup - хороший способ сделать это - извлечь его из общего метода, который возвращает выражение.

РЕДАКТИРОВАТЬ: добавил образец, я изменил подпись Add, так как я не вижу, как вы могли бы передать коллекцию в противном случае.

[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
{

}

Кроме того, хороший способ отладки этих вещей состоит в том, чтобы настроить Mock с помощью MockBehavior.Strict, и после этого вызываемый код будет информировать вас о том, что вам нужно настроить.

...