2011-06-02 27 views
6

IEnumerable的我有與需要一個IEnumerable作爲參數的添加方法的存儲庫:驗證方法被調用用含有「x」的元件與起訂量

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

在單元測試我想要驗證,該方法是叫與包含正好元件相同量爲單位測試的另一個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()))); 
} 

結果一個IEnumerable:

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. 

我在做什麼錯?

回答

3

從你的代碼示例您還沒有設置在x => x.Add的起訂量

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

除非x.All設置,就是要x.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設置你的模擬了,然後你會被調用的代碼,你需要配置什麼通知。

相關問題