已使用IEnumerable调用验证方法,其中包含带有Moq的“x”元素

时间:2011-06-02 13:09:13

标签: c# .net unit-testing moq verify

我有一个带有Add方法的存储库,该方法将IEnumerable作为参数:

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

在unittest中,我想验证是否使用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())));
 }

单元测试的结果:

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 个答案:

答案 0 :(得分:4)

从您的代码示例中,您尚未设置x =&gt; x。添加Moq

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

除非x.All的设置是x.Add?如果是这样,您需要完全匹配验证和设置 - 这样做的一个好方法是将其提取到返回表达式的常用方法。

编辑:添加了一个示例,我已经更改了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设置Mock,然后通过调用的代码通知您需要配置的内容。