C# 验证是否已使用包含';x';最小起订量元素

C# 验证是否已使用包含';x';最小起订量元素,c#,.net,unit-testing,moq,verify,C#,.net,Unit Testing,Moq,Verify,我有一个带有Add方法的存储库,该方法将IEnumerable作为参数: public void Add<T>(T item) where T : class, new(){} public void Add(T项),其中T:class,new(){} 在单元测试中,我想验证使用一个IEnumerable调用此方法,该IEnumerable包含的元素数量与另一个IEnumerable完全相同 [Test] public void InvoicesAreGeneratedForAl

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

public void Add<T>(T item) where T : class, new(){}
public void Add(T项),其中T:class,new(){}
在单元测试中,我想验证使用一个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())));
 }
[测试]
所有学生的公共无效发票()
{
var students=StudentStub.GetStudents();
session.Setup(x=>x.All()).Returns(students.AsQueryable());
服务。生成发票(Payments.Jaar、DateTime.Now);
验证(x=>x.Add(It.Is(
发票=>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.
Moq.MockException:
应至少对模拟进行一次调用,但从未执行过:
x=>x.Add(It.Is(i=>i.Count()==10))
未配置任何设置。

我做错了什么

从您的代码示例中,您还没有在Moq上设置x=>x.Add

session.Setup(x => x.Add(It.IsAny<IEnumerable>());
session.Setup(x=>x.Add(It.IsAny());
除非x.All的设置是x.Add?如果是这样,您需要精确匹配Verify和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
{

}
[TestClass]
公共类UnitTest1
{
[测试方法]
公共void TestMethod1()
{
Mock moqBoo=新Mock();
moqBoo.Setup(IEnumerablehespectednumberofelements(10));
//表演
验证(IEnumerablehespectednumberofelements(10));
}
私有静态表达式IEnumerableHasExpectedNumberOfElements(int expectedNumberOfElements)
{
返回b=>b.Add(It.Is(ie=>ie.Count()==expectedNumberOfElements));
}
}
公共类Boo
{
public void Add(IEnumerable项),其中T:class,new()
{
}
}
公共类发票
{
}
另外,调试这些东西的一个好方法是使用MockBehavior.Strict设置您的模型,然后调用的代码会通知您需要配置什么