2010-03-22 9 views
51

diyoruz. myFilteredFoosCast<IFooBar>() arama sırasında boş olduğu için bu bir istisna atarAyarlar değişken değerleri() Ben Moq Geri arama yöntemleri sözdizimi üzerinde biraz karışık olabilir düşünüyorum

IFilter filter = new Filter(); 
List<IFoo> objects = new List<IFoo> { new Foo(), new Foo() }; 

IQueryable myFilteredFoos = null; 
mockObject.Setup(m => m.GetByFilter(It.IsAny<IFilter>())) 
    .Callback((IFilter filter) => myFilteredFoos = filter.FilterCollection(objects)) 
    .Returns(myFilteredFoos.Cast<IFooBar>()); 

: Böyle bir şey yapmaya çalıştığınızda. Beklediğim gibi çalışmıyor mu? Ben FilterCollection denilen düşünürdüm ve sonra myFilteredFoos boş olmayan olmalı ve döküm için izin verecek.

FilterCollection çağrılan değil sonuca beni çeken bir null dönen yetenekli değildir. Ayrıca, böyle myFilteredFoos bildirirken:

Queryable myFilteredFoos; 

Dönüş çağrısının, başlatılmadan önce myFilteredFoos kullanılabileceğini şikayet ediyor.

sadece dönüş değeri parametre alabilir

cevap

75

Bu Returns yönteminde kod hemen değerlendirilir çünkü; Setup yöntemi çağrılan zaman olmasıdır. GetByFilter yöntemi çağrılır kadar

Bununla birlikte, geri çağrılacağı değildir. siz de kendi yürütme ertelemek böylece

Neyse ki, Returns yöntem aşırı: sadece parametreyi alabilirsiniz çünkü

mockObject.Setup(m => m.GetByFilter(It.IsAny<IFilter>())) 
    .Callback((IFilter filter) => 
     myFilteredFoos = filter.FilterCollection(objects)) 
    .Returns(() => myFilteredFoos.Cast<IFooBar>()); 

Ancak, bir geri aramasında değeri kaydetmek gerekmez Returns yöntemde doğrudan değer: cevap ve kod azaltılması için

mockObject.Setup(m => m.GetByFilter(It.IsAny<IFilter>())) 
    .Returns((IFilter filter) => 
     filter.FilterCollection(objects).Cast<IFooBar>()); 
+0

Teşekkür! –

13

...

mockObject 
    .Setup(m => m.GetByFilter(It.IsAny<IFilter>())) 
    .Returns((IFilter filter) => 
    { 
     myFilteredFoos = filter.FilterCollection(objects); 

     return myFilteredFoos.Cast<IFooBar>(); 
    });