2009-09-03 9 views
8

Estoy buscando una forma de capturar el parámetro real pasado al método para examinarlo más tarde. La idea es obtener el parámetro pasado y luego ejecutar afirmaciones contra él.¿Cómo puedo escribir simulaciones que capturan los parámetros del método y examinarlos más tarde?

Por ejemplo:

var foo = Mock<Foo>(); 
var service = Mock<IService>(); 
service.Expect(s => s.Create(foo)); 
service.Create(new Foo { Currency = "USD" }); 
Assert(foo.Object.Currency == "USD"); 

O ejemplo un poco más complejo:

Foo foo = new Foo { Title = "...", Description = "..." }; 
var bar = Mock.NewHook<Bar>(); 
var service = new Mock<IService>(); 
service.Expect(s => s.Create(bar)); 

new Controller(service.Object).Create(foo); 

Assert(foo.Title == bar.Object.Title); 
Assert(foo.Description == bar.Object.Description); 

Respuesta

13

Creo que estás en busca de algo equivalente a la de devolución de llamada de Moq:

var foo = Mock<Foo>(); 
var service = Mock<IService>(); 
service.Setup(s => s.Create(foo.Object)).Callback((T foo) => Assert.AreEqual("USD", foo.Currency)) 
service.Object.Create(new Foo { Currency = "USD" }); 
+0

Sí, esto funcionaría. ¡Gracias! – alex2k8

+1

Me gusta mucho Moq. http://code.google.com/p/moq/ – TrueWill

0

Si necesita hacer valer en el parámetro pasado a un objeto, parece que está sometiendo el objeto equivocado a tu prueba. En lugar de afirmar los parámetros pasados ​​a un método, escriba una prueba para la clase de llamada que afirma que se pasan los parámetros correctos.

+0

trato de probar que Controller.Create creará y pasar el objeto correcto a IService.Create. – alex2k8

0

Véase también la sección "Las devoluciones de llamada" en Moq's Quickstart documentation:

// access invocation arguments 
mock.Setup(foo => foo.Execute(It.IsAny<string>())) 
    .Returns(true) 
    .Callback((string s) => calls.Add(s)); 
Cuestiones relacionadas