2017-05-04 5 views
-2

Hallo Stackoverflow werfen,MOQ: Wie ein Mock einer Schnittstelle zurück an die Schnittstelle

Ich versuche, Unit-Tests für eine private Methode zu schreiben, die eine Schnittstelle zu erwarten (EnvDTE.Project). Im theMOQ Framework einen Mock dieser Schnittstelle zu erstellen:

Mock<Project> mock = new Mock<Project>(); 

Nachdem im einige Propriétés Einstellung, Ich will diesen Mock werfe auf die Schnittstelle zurück. Ich versuche dies:

mock.As<Project>();     //to implement the Project interface 
Project project = mock as Project; //this set Project to null 
Project project = (Project)mock; //this throws InvalidCastException 

Gibt es einen anderen Weg, um dieses Problem zu lösen? Vielen Dank für die Hilfe :)

+0

Sie erstellen keine Mocks der Klassen selbst, sondern der Dienste, auf die sie angewiesen sind. Sie injizieren diese Abhängigkeiten dann normalerweise über die Konstruktorinjektion. – Wheels73

+0

Ihre Frage ist nicht klar. Warum möchten Sie das verspottete Objekt zurück in die Schnittstelle konvertieren? Funktioniert es nicht ohne Konvertierung? Können Sie die spezifische Verwendung erklären, in der Sie diese Konvertierung durchführen müssen? Auch Schnittstellen haben keine private Methode. Wenn die Klasse, die die Schnittstelle implementiert, eine private Methode hat, sollte sie von Unit Testing dieser bestimmten Klasse nicht über die Schnittstelle getestet werden. –

+0

Ich versuche eine private Methode zu testen. – Desiigner

Antwort

1

Sie Ihr verspottet Objekt mit zugreifen:

var mock = new Mock<Project>(); 
Project project = mock.Object; 
+0

So einfach und es funktioniert: D vielen Dank :) – Desiigner

+0

@Desiigner - Wie können Sie damit eine private Methode testen? – Wheels73

+0

@ Wheels73 mit einem PrivateObject der Klasse und dann ich die Methode aufrufen und ein Objekt Array verwenden, um den Parameter zu definieren. – Desiigner

0

Wie bereits erwähnt, müssen Sie nicht verspotten, was Sie tun.

Angenommen, wir haben eine Klasse namens "Project".

Wir können dann einen Test schreiben, der den PrivateObject-Ansatz verwendet, den Sie ausführen möchten.

[TestMethod] 
public void VerifyAmountTest() 
{ 
    //Using PrivateObject class 
    PrivateObject privateHelperObject = new PrivateObject(typeof(Project)); 
    double amount = 500F; 
    bool expected = true; 
    bool actual; 
    actual = (bool)privateHelperObject.Invoke("VerifyAmount", amount); 

    Assert.AreEqual(expected, actual); 
} 

Dies wird erreichen, was Sie wollen.

+0

Ja, das funktioniert für normale Komponententests, aber nicht für dieses. – Desiigner

Verwandte Themen