Pregunta

Soy nuevo en simulacros y estoy decidiendo un marco simulado. Las Moq home citas

  

Actualmente, es la única burla   biblioteca que va en contra de la   generalizado y poco intuitivo   (especialmente para principiantes) Grabar / Responder   enfoque de todos los demás marcos.

¿Alguien puede explicar simplemente cuál es el enfoque de Grabar / Reproducir y cómo difiere Moq? ¿Cuáles son los pros y los contras de cada uno, especialmente desde el punto de decidir un marco?

Gracias.

¿Fue útil?

Solución

El enfoque de grabación / reproducción es compatible con RhinoMocks . La idea básica es que la ejecución de su prueba se divide en dos fases, la fase de grabación y la fase de reproducción. Para ser un poco más concreto

var repo = new MockRepository();
var dependency = repo.DynamicMock<IDependency>();
With.Mocks(repo).Expecting(delegate {
         Expect.Call(dependency.AMethod(1)).Return(result);                    
      }).Verify(delegate {
         var sut = new Sut(wrappee);
         sut.DoStuffThatCallsAMethod();
         Assert.IsTrue(sut.ResultState);
      });

Por lo tanto, el bloque de espera es la fase de grabación y el bloque de verificación es la fase de reproducción.

La variante Moq de este código sería

var dependency = new Mock<IDependency>();
dependency.Expect(dep => dep.AMethod(1)).Returns(result);          
var sut = new Sut(wrappee.Object);
sut.DoStuffThatCallsAMethod();
Assert.IsTrue(sut.ResultState);

Que como puedes ver es mucho más agradable de leer. Solía ??usar RhinoMocks pero desde que descubrí Moq solo uso Moq. Me parece que produce código mucho más legible. Así que mi consejo sería ir por Moq.

Otros consejos

RhinoMocks es realmente muy versátil, puede usar cualquier enfoque. RhinoMocks se ve un poco mejor que Moq bajo el estilo esperar / verificar. Sin embargo, incluso el hecho de que puede usar este estilo está oculto en la documentación (la última vez que miré). Elegimos Moq sobre RhinoMocks en mi proyecto actual porque no nos dimos cuenta de que sí configura / verifica.

La sintaxis de grabación / reproducción le permite cambiar el valor que un método devolverá en las llamadas posteriores a ese método. Esto puede ser útil a veces. Dicho esto, la necesidad de hacer esto es a menudo un olor que su diseño no es del todo correcto. Sin embargo, es útil cuando puedes ver lo que está mal y tienes que seguir adelante.

Moq tiene la capacidad de cambiar el valor, pero es algo torpe (de la documentación)

// returning different values on each invocation 
var mock = new Mock<IFoo>(); 
var calls = 0; 
mock.Setup(foo => foo.GetCountThing())
.Returns(() => calls)
.Callback(() => calls++); 

He salido directamente de Grabar / Reproducir porque hace que sea difícil ver en la configuración lo que se tropezó / se burló o simplemente se está ejecutando el código. Creo que Rhino tiene múltiples formas de trabajar. En particular, puede usar un bloque using () para aislar la configuración de otras llamadas.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top