2010-03-22 5 views
51

Penso che potrei essere un po 'confuso sulla sintassi dei metodi di richiamata Moq. Quando provo a fare qualcosa di simile:Impostazioni valori variabili in una chiamata Callback Moq()

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>()); 

Questo genera un'eccezione perché myFilteredFoos è null durante la chiamata Cast<IFooBar>(). Non funziona come mi aspetto? Penserei che sarebbe chiamato FilterCollection e quindi myFilteredFoos sarebbe non-null e consentire il cast.

FilterCollection non è in grado di restituire un valore null che mi richiama alla conclusione che non viene chiamato. Inoltre, quando dichiaro myFilteredFoos come questo:

Queryable myFilteredFoos; 

La chiamata di ritorno lamenta che myFilteredFoos possono essere utilizzati prima che venga inizializzato.

risposta

75

Questo perché il codice nel metodo Returns viene valutata subito; ovvero, quando viene invocato il metodo Setup.

Tuttavia, la richiamata non viene invocata finché non viene richiamato il metodo GetByFilter.

Per fortuna, il metodo Returns è sovraccarico in modo da poter rinviare la sua esecuzione, nonché:

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

Tuttavia, non è necessario per salvare il valore in una richiamata, perché si può solo ottenere il parametro valore direttamente nel metodo Returns:

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

Grazie per la risposta e la riduzione del codice! –

13

Si può solo prendere il parametro del valore di ritorno ...

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

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