Tengo una prueba de unidad para verificar que un objeto (por ejemplo, Foo
) llame a cierto método (por ejemplo, Bar
) cuando se desencadena un evento con ciertos eventArgs. Para burlarse de dicho método, utilizo virtual y golpeo la clase¿Cómo forzar a moq a llamar al constructor?
Mock<Foo> stubbedFoo = new Mock<Foo>(mockEventProvider);
mockEventProvider.Raise(x => x.MyEvent += null, myEventArgs) //fire the event
stubbedFoo.Verify(foo => foo.Bar()); verify Bar is called as a result
Foo
Sin embargo, lo anterior no, Bar no se llamará, al parecer porque el objeto no es Foo evento construida. Sin embargo, si añado una línea como la siguiente:
Mock<Foo> stubbedFoo = new Mock<Foo>(mockEventProvider);
var workAround = stubbedFoo.Object //adding this workaround will work
mockEventProvider.Raise(x => x.MyEvent += null, myEventArgs) //fire the event
stubbedFoo.Verify(foo => foo.Bar()); verify Bar is called as a result
que va a funcionar, porque llamar a conseguir en .Object aparentemente obliga maqueta para construir el objeto. ¿Hay una solución más elegante que agregar esta línea?
I mira ... ¿crees que esto es un defecto en moq? –
Yo diría que esto fue probablemente una decisión intencional, pero moq es de código abierto, así que puedes cambiarlo si quieres – devshorts