2011-06-02 19 views
6

ile 'x' öğeleri içeren anılmıştırdoğrulama metodu parametre olarak bir IEnumerable alan bir eklenti yöntemi ile bir havuz var IEnumerable MSM

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. 
: birim test başka 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()))); 
} 

Sonucu elemanların tam olarak aynı miktarda içeren bir IEnumerable ile adı

Neyi yanlış yapıyorum? kodunuzu örnekten

cevap

3

Eğer kurmadıysanız x => x.Add x.All için Kurulum x.Add olması gerekiyordu sürece Moq

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

üzerinde? Öyleyse Doğrula ve Kurulum ile tam olarak eşleştirmeniz gerekir - bunu yapmak için iyi bir yol, bunu bir İfade döndüren ortak bir yönteme çıkarmaktır.

DÜZENLEME: Bir örnek ekledim, aksi halde bir koleksiyonu nasıl geçirebileceğinizi göremediğim için Ekle imzasını değiştirdim.

[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 
{ 

} 

Ayrıca bunları hata ayıklamak için iyi bir yol MockBehavior.Strict ile Mock kurmaktır ve sonra yapılandırmak için gerekenleri çağrılan kod tarafından haberdar olacak.