2009-04-22 25 views
1

Ich versuche eine Methode zu testen. Ich möchte ensrur, dass es ein Methodenaufruf ist in diesem Verfahren (Aufruf Service) der Code sieht wie folgt aus: Bypass zum Testen entsorgen

using(proxy = new Proxy()) 
{ 
     proxy.CallService(); 
} 

ich tauschen die Proxy mit gefälschten Objekt (mit TypeMock), aber Fehler erhalten, weil der gefälschter Gegenstand am Ende des Blocks. Ich möchte diesen "using" -Block nicht entfernen. Dank

Antwort

0

Disclaimer: Ich bei Typemock arbeiten
Wenn Sie das Vereinbaren Act Assert API verwenden, können Sie Members.ReturnRecursiveFakes verwenden, wenn Sie Ihre gefälschte Objekt erstellen (Hinweis: Dies ist die Standardeinstellung ab Version 5.2.0) Dies wird automatisch auch die Dispose-Methode fälschen.

so wird Ihr Test so etwas wie dieses:

var fake = Isolate.Fake.Instance<Proxy>(Members.ReturnRecursiveFakes); 
Isolate.WhenCalled(() => fake.CallService()).IgnoreCall(); 
Isolate.Swap.NextInstance<Proxy>().With(fake); 

UnderTest classUnderTest = new ClassUnderTest(); 
classUnderTest.MethodUnderTest(); // assuming the Proxy instance is used here. 

Isolate.Verify.WasCalledWithAnyArguments(()=>fake.CallService()); 

ich hinzufügen möchten, was Jon Skeet sagte, ich würde einen separaten Test zu schaffen, dass die Dispose-Methode zu gewährleisten, wird aufgerufen.
Ich denke, es ist eine gute Praxis, eine Sache in jeder Testmethode zu behaupten, auf diese Weise, wenn ein Test bricht, werden Sie den Grund sofort wissen.

1

Lassen Sie das Mock-Objekt erwarten, dass es auch entsorgt wird. (Ich kenne TypeMock nicht, aber in einigen anderen spöttischen Frameworks wäre es nur ein Fall von Dispose selbst während der "Record" -Phase.) Tatsächlich würde ich sagen, dass ohne diesen Test der Test sowieso falsch ist, weil vermutlich Sie möchten sicher sein, dass der Proxy entsorgt wird.

0

Weisen Sie Ihren Proxy-Proxy an, einen Anruf an Dispose() zu erwarten. Wenn Sie reflektierende Mocks verwenden müssen Sie so etwas wie diese

var proxyMock = MockManager.Mock(typeof(Proxy)); 
// set up regular calls to proxy, e.g. 
proxyMock.ExpectCall("CallService"); 
proxyMock.ExpectCall("Dispose"); 

für natürlichen Mocks einen Aufruf an Dispose() in Ihrem mit Block platzieren zu tun.

0

Machen Sie das gefälschte Objekt IDisposable implementieren:

class FakeObject : IDisposable 
{ 
    public void Dispose() {} 
} 
+0

OP verwendet TypeMock, daher gibt es keine explizite falsche Proxy-Klasse. –