Mam test jednostki, aby sprawdzić, czy dany obiekt (na przykład Foo
) wywoła określoną metodę (na przykład Bar
), gdy zdarzenie zostanie wywołane z pewnymi zdarzeniami eventArgs. Mock wspomnianą metodę, używam wirtualnych i skrótową klasęJak zmusić moq do wywołania konstruktora?
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
Jednakże powyższe nie powiodło, bar nie zostanie wywołana, prawdopodobnie dlatego, że obiekt nie jest zdarzenie Foo zbudowane. Jednakże jeśli dodać linię jak poniżej:
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
To będzie działać, ponieważ powołanie się na .Object podobno wymusza makiety do budowy obiektu. Czy istnieje bardziej eleganckie rozwiązanie niż dodanie tej linii?
I widzisz .. myślisz, że to jest błąd w moq? –
Powiedziałbym, że to była prawdopodobnie celowa decyzja, ale moq jest open source, więc możesz to zmienić, jeśli chcesz – devshorts