2009-05-31 14 views
9

Podczas wykonywania drugą linię tego kodu Rhino Mocks rzuca InvalidOperationException z komunikatem „Ta akcja jest nieważny, gdy atrapa obiektu jest w stanie replay”Kiedy obiekt próbny wchodzi w stan odtwarzania?

var mockScanner = MockRepository.GenerateMock<PortScanner>(null); 
     mockScanner.Expect((scanner => { scanner.Scan(null, null); })); 

Stepping poprzez kod w debuggera można zobaczyć debugger uruchamia metodę zdefiniowaną w klasie i bezpośrednio po tym, jak kontrola opuści tę metodę, wystąpi wyjątek.

Podobny kod w innym teście działa bez problemu

var mockView = MockRepository.GenerateMock<IScanView>(null); 
     mockView.Expect(view => { view.Close(); }); 
     var controller = new ScanController(mockView); 
     controller.Exit(); 
     mockView.VerifyAllExpectations(); 

Jedyna różnica, że ​​mogę myśleć, że może być z dowolnego consequense między theese dwóch testów jest to, że wyjście jest członkiem na interfejsie while Skanowanie jest wirtualnym członkiem klasy

Czego mi brakuje?

Aktualizacja
Dalsze badania wykazały, że jest to związane ze sposobem Rhino obsługuje metod wirtualnych. Skupiam się teraz na badaniu mmy dokumentacji tutaj

Odpowiedz

12

Wyjątek został spowodowany, ponieważ Rhino Mocks nie ma wymaganego poziomu dostępu do typu w celu wyśmiewania go prawidłowo. Udzielanie wewnętrznego dostępu do zestawu Rhino Mocks przy użyciu funkcji InternalsVisible, aby rozwiązać problem.

Należy zauważyć, że nie ma to wpływu na interfejsy. Sądzę, że powodem tego jest fakt, że szydercza struktura musi zastąpić implementację w klasie, której nie ma w interfejsie.

+1

Po prostu czytałem o tym dzisiaj. Link do dokumentacji wiki Rhino Mocks to: http://ayende.com/Wiki/(S(vcy2bn55h5cja0vsedn14y45))/Rhino+Mocks+-+Internal+Methods.ashx –

0

Co się stanie, jeśli usuniesz dodatkowy zestaw nawiasów z pierwszego wyrażenia?

var mockScanner = MockRepository.GenerateMock<PortScanner>(null); 
mockScanner.Expect(scanner => { scanner.Scan(null, null); }); 
+0

Następnie moja składnia dostaje trochę cleamer (dzięki :)), niestety mój test wciąż rzuca – Crippledsmurf

+0

Jakiekolwiek znaczenie parametru null w konstruktorze. Co stanie się, jeśli podasz poprawny obiekt zamiast wartości NULL? – tvanfosson

+0

Są to zwykle obiekty IPAddress, które są przekazywane przez prawdziwy kontroler. Są puste, ponieważ są bardziej wygodne w pisaniu niż cokolwiek innego (jest 3:47 AM), ale w tej chwili ta metoda jest pustym odgałęzieniem, które nie używa parametrów w dowolnym miejscu. Próbowałem ich również z prawdziwymi wartościami parametrów, wciąż otrzymuję ten sam wyjątek Myślę, że jest to znak, że jestem oficjalnie za stary, by kodować to późno. – Crippledsmurf

Powiązane problemy