2011-06-02 13 views
6

साथ 'एक्स' तत्वों से युक्त के साथ बुलाया गया है मैं एक जोड़ें विधि पैरामीटर के रूप में एक IEnumerable लेता है के साथ एक भंडार है:सत्यापित करें विधि IEnumerable Moq

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

एक unittest इस बात की पुष्टि करने के लिए इस विधि है कि चाहते हैं

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. 
: एक 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()))); 
} 

परिणाम के रूप में तत्वों का ठीक उसी मात्रा में होता है के साथ कहा जाता है

मैं क्या गलत कर रहा हूँ?

उत्तर

3

अपने कोड उदाहरण से आप सेट नहीं किया है एक्स => x.Add Moq

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 के साथ अपने नकली सेट करने के लिए है और फिर आप लागू कोड क्या आप विन्यस्त करने की जरूरत द्वारा सूचित किया जाएगा।