2013-09-04 5 views
9

Obecnie piszę testy jednostkowe i kpiąc z zależności za pomocą ramy Moq. W ten sposób ja stworzyliśmy Mock tak:Alter Mock <IType> obiekt po właściwości .Object został nazwany

Mock<ITraceProvider> traceProviderMock = new Mock<ITraceProvider>(); 
traceProviderMock.Setup(x => x.GetTraceContext(It.IsAny<string>())).Returns("test"); 
ITraceProvider traceObj = traceProviderMock.Object; 

Jednak później chcę zmodyfikować zachowanie makiety trochę więcej więc wzywam Setup na atrapa obiektu znowu:

traceProviderMock.Setup(x => x.GetTracer(It.IsAny<string>())).Returns("tracer"); 

Teraz ponownie bez wywoływania traceProviderMock.Object, czy to nowe pozorowane zachowanie odzwierciedli się w traceObj? Tak właśnie chciałbym być.

To z pewnością zadziała w metodzie Verify(), ale nie pojawia się w przypadku metody Setup.

Powód, dla którego chcę to zrobić, wynika z faktu, że skonstruowałem pełny wykres zależności w metodzie testu z użyciem wyśmiewanej zależności. Chcę tylko zmienić zachowanie jednej z wyśmianych zależności dla mojego konkretnego testu. Kolejne testy będą również stosowały własne specjalizacje do wyśmiewanej zależności.

+0

Czy metoda "GetTracer" jest ustawiana w konfiguracji testowej? –

+0

Nie, to konfiguracja w określonej metodzie testu. Jest to specyficzna dla testu specjalizacja dla Mock'a, jeśli ma to sens. –

+0

Zrobiłem test, i zadziałało to dla mnie. Mogłem ustawić metodę 'GetTracer' po pobraniu obiektu z' traceProviderMock', i zwróciło oczekiwaną wartość. Czy jesteś pewien, że Twoje twierdzenia są poprawnie skonfigurowane? Czy możesz przejść przez kod w debugerze, jeśli jeszcze tego nie zrobiłeś? –

Odpowiedz

14

To zachowanie działa tak, jak tego oczekiwałem. Z powodu problemu z moim testem, nie odwoływałem się do nowo wyśmiewanej metody. To wprowadza mnie w błąd, by sądzić, że szydercze ramy nie zachowały się.

Podsumowując, można zmienić próbę po wywołaniu obiektu .Object, a zmiany zostaną odzwierciedlone w wyśmiewanej instancji obiektu.

+0

Zastanawiałem się, zastanawiając się, dlaczego Moq nie postępuje właściwie, dopóki nie przeczytam tego, przypominając mi, żebym spróbował jakiegoś prostego ciasta. Sprawdził obiekt zależny i okazało się, że nie używał obiektu Mock.Object zgodnie z oczekiwaniami ... moja wina. – Sully

Powiązane problemy