2011-01-28 6 views
12

ho questo codice:Rientro diverse istanze per ogni chiamata utilizzando rinoceronte schernisce

Expect.Call(factory.CreateOrder()) 
    .Return(new Order()) 
    .Repeat.Times(4); 

Quando si parla di quattro volte, ogni volta che la stessa istanza viene restituita. Voglio che vengano restituite le istanze di differenza. Vorrei poter fare qualcosa del tipo:

Expect.Call(factory.CreateOrder()) 
    .Return(() => new Order()) 
    .Repeat.Times(4); 

Questo può essere fatto in qualche modo?

+0

Stai escludendo la registrazione delle aspettative? – CSharpenter

+0

Mi piacerebbe che '.Return (Func )' esista. –

+0

Csharpenter, cosa intendi? Io uso _mocker.ReplayAll(); e _mocker.VerifyAll(); ... – Allrameest

risposta

14

Invece di utilizzare

.Return(new Order()); 

Provare a utilizzare

.Do((Func<Order>)delegate() { return new Order(); }); 

Questo chiamerà il delegato di volta in volta, la creazione di un nuovo oggetto.

+4

Una cosa da considerare è che la firma della funzione deve corrispondere alla chiamata originale anche se non si sta andando per tramandarlo. Il mio ha finito per assomigliare a qualcosa del genere: '.Stub (m => m.Load (docId)). Do ((Func ) (arg => GetDocument()));' Nota come il lungo viene semplicemente scaricato. Altrimenti si ottiene un'eccezione. –

2

Ripetere 4 volte vostra aspettativa specificando un valore di ritorno diverso ogni volta (notare la Repeat.Once()) UPDATE

for (int i = 0; i < 4; i++) 
    Expect.Call(factory.CreateOrder()).Repeat.Once().Return(new Order()); 

: Credo che il seguente funzionerà così:

Expect.Call(factory.CreateOrder()) 
    .Repeat.Once().Return(new Order()) 
    .Repeat.Once().Return(new Order()) 
    .Repeat.Once().Return(new Order()) 
    .Repeat.Once().Return(new Order()); 
+0

Il primo ha funzionato, il secondo non ha ... – Allrameest

2

Patrick Steele ha suggerito questo metodo extenstion:

public static IMethodOptions<T> Return<T>(this IMethodOptions<T> opts, Func<T> factory) 
{ 
    opts.Return(default(T)); 
    opts.WhenCalled(mi => mi.ReturnValue = factory()); 
    return opts; 
} 

See his blog entry per maggiori dettagli.