2017-09-01 1 views
3

Ich versuche, einige Tests für eine bestimmte Schnittstelle mit Moq schreiben. Die Werte des Objekts, das die Schnittstelle implementiert, werden von einer Klasse festgelegt, die wir in dieser Frage "Controller" nennen.Wie bekomme ich einen Wert von einer verspotteten Schnittstelle, die mit Moq nicht funktioniert?

Schnittstelle:

public interface ITestInterface 
{ 
    int number {set;} 
} 

Und mein Mock:

Mock<ITestInterface> myTestMock = new Mock<ITestInterface>(); 

Um den Test zu tun, erwarte ich, dass die Steuerung die Zahl in der verspottete Klasse setzen, aber dann muß ichbekommen der Wert, um es zu testen. Etwas wie folgt aus:

Controller c = new Controller(myTestMock.Object); 
c.Initialize(); //initialization will set number to something 
Assert.AreEqual(myTestMock.number, 3); 

Natürlich bekomme ich einen Fehler, weil ich diesen Wert nicht lesen kann, da die Schnittstelle nicht über eine „get“ -Methode.

Wie kann ich ein Get für meinen Mock einrichten, ohne die Schnittstelle zu ändern?

+1

Statt 'Assert.AreEqual' schreiben, vielleicht können Sie' myTestMock.VerifySet verwenden (x => x.number = 3); ' –

+0

@ThariqNugrohotomo es wird mir den gleichen Fehler geben "fehlt ein Accessor" – Th0rndike

+2

@ Th0rndike - entfernen Sie die 'Assert' Zeile. @Thariq ist richtig 'myTestMock.VerifySet (x => x.number = 3);' funktioniert. (Habe es gerade getestet, es war auch neu für mich). - angenommen 'c.Initialize();' * really * setzt die Zahl. Ich habe sogar versucht, 'myTestMock.VerifySet (x => x.number = 4);' und es hat den Test nicht bestanden, weil es nur erkannte, dass es auf 3, nicht auf 4 gesetzt wurde. – Corak

Antwort

0

Verwenden Sie Ihre eigene Implementierung

public class FakeTestInterface : ITestInterface 
{ 
    public int NumberValue { get; private set; } 
    public int number 
    { 
     set 
     { 
      NumberValue = value; 
     } 
    } 
} 

Dann im Test

var testMock = new FakeTestInterface(); 
var controller = new Controller(testMock); 
controller.Initialize(); 
Assert.AreEqual(testMock.NumberValue, 3); 

Alle spöttischen Frameworks entwickelt wurde unser Leben leichter zu machen, weil wir eigene „fake“ Umsetzung nicht schreiben müssen .
Wenn Sie Probleme mit spöttischen Frameworks faces - Ihr eigenes Mock-Objekt

Verwandte Themen