2010-07-29 7 views
30

Tratar de burlar el siguiente método:El uso de burla de Rhino para burlarse de un parámetro de salida, que se crea en el método que estoy probando

bool IsLoginValid(LoginViewModel viewModel, out User user); 

probado este principio:

dependency<ILoginService>() 
.Stub(serv => 
     serv.IsLoginValid(
      Arg<LoginViewModel>.Is.Equal(a_login_viewmodel), 
      out Arg<User>.Is.Anything) 
.Return(false); 

embargo, que no logra , ya que es un parámetro de salida. Hice un poco de búsqueda y alteré mi código como tal:

dependency<ILoginService>() 
.Stub(serv => 
     serv.IsLoginValid(
      Arg<LoginViewModel>.Is.Equal(a_login_viewmodel), 
      out Arg<User>.Out(new User()).Dummy)) 
.Return(false); 

Eso también falla. Necesito que 'nuevo usuario()' sea una especie de argumento 'Cualquier cosa'. Como creo que está esperando una instancia específica.

¿Alguna idea de cómo evitar esto? Gracias chicos.

+1

¿Qué error obtienes en el último caso? Parece correcto ... – Grzenio

Respuesta

39

Pruebe la opción "OutRef". Acepta un objeto params [] que define el resultado para cada parámetro de salida. Como solo tienes uno, solo necesitas un resultado. He aquí una rápida maqueta de lo que he intentado eso debería funcionar en su situación:

var foo = MockRepository.GenerateStub<IFoo>(); 
var viewModel = new LoginViewModel(); 
User temp; 
foo.Stub(f => f.IsLoginValid(viewModel, out temp)).OutRef(new User()).Return(false); 

User outparam; 
Assert.IsFalse(foo.IsLoginValid(viewModel, out outparam)); 
+1

Aaah, sí, tú absoluta leyenda. Eso funcionó perfectamente. Gracias amigo! – ctrlplusb

12

Cambio de la respuesta aceptada (por @Patrick Steele) para que coincida con los nombres de las variables y espacios en blanco en la pregunta:

.Stub(serv => serv.IsLoginValid(
      a_login_viewmodel, 
      out temp)).OutRef(new User()) 
.Return(false); 

... a continuación, cambiar la sintaxis (pero no la semántica) a la fluidez Args sintaxis:

.Stub(serv => serv.IsLoginValid(
      Arg<LoginViewModel>.Is.Equal(a_login_viewmodel), 
      out Arg<User>.Out(new User()).Dummy)) 
.Return(false); 

... entonces nos encontramos con exactamente la misma sintaxis que el segundo intento de la OP, whic h aparentemente "falla". Personalmente, prefiero el estilo fluido de 'Args', aunque es un poco más detallado.

TL; DR el segundo intento del OP es semánticamente equivalente a la respuesta aceptada, simplemente utiliza una sintaxis diferente.

+0

No lo entiendo, el ejemplo de sintaxis Args con fluidez en su respuesta es el mismo que el segundo enfoque de @ctrlplusb. Se queja de que esto tampoco se está ejecutando. ¿Me estoy perdiendo de algo? –

+0

@ AntonKalcik: lo que * _I_ * no entiendo es por qué el OP dice "Eso funcionó a la perfección" y lo acepta como The One True Answer cuando es semánticamente equivalente a algo que originalmente dijo "falla". Mi respuesta básicamente dice: no abandones una sintaxis superior simplemente porque corrigió involuntariamente un error cuando reescribiste la cosa. " – onedaywhen

+0

Tienes razón, solo pregúntame, porque estaba confundido. Lo probé y tu sintaxis se asemeja exactamente a la de Patrick Steel código. –

Cuestiones relacionadas