Метод Verify был вызван с помощью IEnumerable, содержащего элементы " x " с Moq
у меня есть репозиторий с методом 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 ответов
в примере кода Вы не настроили x => x.Добавьте на Moq
session.Setup(x => x.Add(It.IsAny<IEnumerable>());
Если настройки для X.Все это означало, чтобы быть x.Добавить? Если это так, вам нужно точно сопоставить Verify и Setup - хороший способ сделать это-извлечь его в общий метод, который возвращает выражение.
EDIT: добавлен образец, я изменил подпись 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
{
}
кроме того, хороший способ отладки этих вещей чтобы настроить макет с помощью MockBehavior.Strict, а затем вы будете проинформированы вызываемым кодом, что вам нужно настроить.