2009-05-31 5 views
9

Wenn die zweite Zeile dieser Code Rhino Mocks eine InvalidOperationException mit einer Nachricht führt die Ausführung „Aktion ist ungültig, wenn das Mockobjekt in Replay Zustand“Wann tritt ein Mock-Objekt in den Wiedergabestatus ein?

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

der Code in einem Debugger Stepping durch eines der sehen kann Debugger führt die in der Klasse definierte Methode aus und direkt nach der Kontrolle verlässt diese Methode die Ausnahme.

Dieser ähnliche Code in einem anderen Test funktioniert ohne Problem

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

Der einzige Unterschied, dass ich daran denken kann jeden consequense zwischen ond zwei Tests sein könnte, dass Exit ist ein Mitglied an einer Schnittstelle während Scan ist ein virtuelles Mitglied in einer Klasse

Was fehlt mir?

aktualisieren
Weitere Explorations haben darauf hingewiesen, dass dies auf die Art und Weise zusammenhängt Rhino virtuelle Methoden behandelt. Ich konzentriere mich jetzt auf das Studium der Dokumentation hier

Antwort

12

Die Ausnahme verursacht wurde, weil Rhino Mocks es hat nicht das erforderliche Maß an Zugriff auf die Art haben, um richtig zu verspotten. Durch den internen Zugriff auf die Rhino Mocks-Assembly mithilfe von InternalsVisibleTo wurde das Problem behoben.

Es ist bemerkenswert, dass dies keine Auswirkungen auf die Schnittstellen hat. Ich glaube, der Grund dafür ist, dass das Mocking-Framework die Implementierung in einer Klasse überschreiben muss, in der es keine Schnittstelle gibt.

+1

Ich habe gerade gelesen, dass ich das heute mache. Der Dokumentationslink zum Wiki-Eintrag von Rhino Mocks lautet: http://ayende.com/Wiki/(S(vcy2bn55h5cja0vsedn14y45))/Rhino+Mocks+in-Internal+Methods.ashx –

0

Was passiert, wenn Sie den zusätzlichen Satz von Klammern aus dem ersten Ausdruck entfernen?

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

Dann bekommt meine Syntax ein wenig cleamer (danke :)), leider wirft mein Test immer noch – Crippledsmurf

+0

Jede Bedeutung für den Null-Parameter im Konstruktor. Was passiert, wenn Sie dort ein gültiges Objekt anstelle von null übergeben? – tvanfosson

+0

Sie sind normalerweise IPAddress-Objekte, die von einem echten Controller übergeben werden. Sie sind null, weil es einfacher zu schreiben ist als alles andere (es ist 3:47 Uhr), aber im Moment ist diese Methode ein leerer Stub, der die Parameter nirgendwo verwendet. Ich habe sie auch mit echten Parameterwerten ausprobiert, die ich immer noch bekomme die gleiche Ausnahme Ich denke, das ist ein Zeichen dafür, dass ich offiziell zu alt bin, um dieses späte Programm zu kodieren. – Crippledsmurf