简体   繁体   English

已使用包含 'x' 元素的 IEnumerable 调用了验证方法和 Moq

[英]Verify method has been called with IEnumerable containing 'x' elements with Moq

I have a repository with an Add method that takes an IEnumerable as parameter:我有一个带有 Add 方法的存储库,该方法以 IEnumerable 作为参数:

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

In a unittest I want to verify that this method is called with an IEnumerable that contains exactly the same amount of elements as another IEnumerable在单元测试中,我想验证此方法是否使用包含与另一个 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())));
 }

Result of the unit test:单元测试结果:

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.

What am I doing wrong?我究竟做错了什么?

From your code example you haven't set up the x => x.Add on the Moq从您的代码示例中,您尚未在 Moq 上设置 x => x.Add

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

Unless the Setup for x.All is meant to be x.Add?除非 x.All 的设置是 x.Add? If so, you need to match the Verify and Setup exactly - a good way to do that is to extract it to a common method that returns an Expression.如果是这样,您需要完全匹配验证和设置 - 一个很好的方法是将其提取到返回表达式的通用方法中。

EDIT: Added a sample, I have changed the signature of Add as I can't see how you could pass a collection otherwise.编辑:添加了一个示例,我更改了 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
{

}

Also, a good way to debug these things is to set your Mock up with MockBehavior.Strict and then you'll be informed by the invoked code what you need to configure.此外,调试这些东西的一个好方法是使用 MockBehavior.Strict 设置您的 Mock,然后调用的代码会通知您需要配置什么。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM