2011-01-28 19 views
12

Tengo este código:diferentes instancias para cada llamada mediante la burla de Rhino

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

Cuando esto se llama cuatro veces, cada vez que se devuelve la misma instancia. Quiero que se devuelvan instancias de diferencia. Me gustaría poder hacer algo como:

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

¿Se puede hacer de esta manera?

+0

¿Está descartando la grabación de las expectativas? – CSharpenter

+0

Me gustaría que '.Return (Func )' exista. –

+0

Csharpenter, ¿qué quieres decir? Yo uso _mocker.ReplayAll(); y _mocker.VerifyAll(); ... – Allrameest

Respuesta

14

En lugar de usar

.Return(new Order()); 

Intente utilizar

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

Para ello, será el delegado cada vez, la creación de un nuevo objeto.

+4

Una cosa a tener en cuenta es que la firma de la función debe coincidir con la llamada original, incluso si no va para pasarlo. El mío terminó pareciéndose a algo así: '.Stub (m => m.Load (docId)). Do ((Func ) (arg => GetDocument()));' Observe cómo se acaba de abandonar el largo. De lo contrario, obtienes una excepción. –

2

Repetir 4 veces sus expectativas mediante la especificación de un valor de retorno diferente cada vez (nota la Repeat.Once()) ACTUALIZACIÓN

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

: Creo que el siguiente trabajo, así:

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

El primero funcionó, el segundo no ... – Allrameest

2

Patrick Steele sugirió este método 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 para más detalles.

Cuestiones relacionadas