2009-09-03 4 views
8

Sto cercando un modo per acquisire il parametro effettivo passato al metodo per esaminarlo in seguito. L'idea è di ottenere il parametro passato e quindi eseguire asserzioni contro di esso.Come posso scrivere mock che catturano i parametri del metodo ed esaminarli in seguito?

Per esempio:

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 un esempio un po 'più complesso:

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); 

risposta

13

Penso che tu sia alla ricerca di qualcosa di equivalente a Callback di 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ì, funzionerebbe. Grazie! – alex2k8

+1

Mi piace molto il Moq. http://code.google.com/p/moq/ – TrueWill

0

Se avete bisogno di affermare il parametro passato a un oggetto, a quanto pare si sta sottoponendo l'oggetto sbagliato alla tua prova. Invece di affermare i parametri passati a un metodo, scrivere un test per la classe chiamante che asserisce che i parametri corretti sono passati.

+0

cerco di provare che Controller.Create creerà e passare l'oggetto corretto in IService.Create. – alex2k8

0

Vedi anche sezione "callback" in Moq's Quickstart documentation:

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