2017-10-31 1 views
1

Im unten angegebenen Szenario habe ich einen Verweis auf einigeExternal.Library.dll hinzugefügt und eine Klasse mit dem Namen MyClass von BaseClass abgeleitet. MyClass ruft die MakeCall() - Methode von BaseClass intern in ihren Methoden auf. Hier ist die 'BaseClass' eine konkrete Klasse, die keine Schnittstelle implementiert und auch die MakeCall() - Methode ist eine nicht-virtuelle Methode.Wie mokiere ich Base-Class-Funktionsaufrufe mit MOQ?

in so einem Szenario, wie spotze ich nur die MakeCall() -Methode der Basisklasse? Ich mag für "MyClass" Unit-Tests schreiben

public class MyClass : BaseClass 
{ 

public void DoSomething() 
{ 
    //someExternal.Library.dll is referenced to the project 
    // Makecall() is available to this class through inheritance 

    MakeCall(); 
    ... 

} 

    public bool DoSomethingElse() 
{ 
     ... 
    } 
} 

in dem obigen Schnipsel Ich mag für 'MyClass' Einheit-Test schreiben, und ich soll Mock obj.MakeCall() in der Lage sein; Methodenaufruf mit MoQ.

ANMERKUNG: MOQ ist der einzige Mockframework darf ich

Antwort

1

Da Ihr Basismethode verwenden, weder implementiert jede Schnittstelle noch als virtuelle markiert, Moq können Sie nicht zu diesem bestimmten Szenario helfen, da es einen Proxy generiert Dadurch wird die Schnittstelle implementiert oder eine abgeleitete Klasse erstellt, die eine Methode überschreibt, um Aufrufe abzufangen.

Wenn Ihre Basisklasse kein Legacy-Code ist, den Sie nicht berühren können, würde ich empfehlen, eine Schnittstelle hinzuzufügen und direkt zu mokieren.

andernfalls die folgende Antwort für Moq Alternativen, die direkt mit dem IL arbeiten und können versiegelte Klassen verspotten:

https://stackoverflow.com/a/21793891/3400897