2017-06-13 3 views
-2
 public interface Interface1 
    { 
     void DoSomething1(int a); 
    } 

    public interface Interface2 
    { 
     void DoSomething2(int a); 
    } 

    public class Class1: Interface1 
    { 
     private Interface2 _interface2; 

     public Class1(Interface2 _interface2) 
     { 
      this._inteface2= _interface2; 
     } 

     public void DoSomething1(int a) 
     { 
      _interface2.DoSomething2(a); 
     } 
    } 

public class Class2: Interface2 
    { 
     public void DoSomething2(int a) 
     { 
      // some action 
     } 
    } 

Dies ist Code, der vereinfacht wird. Ich frage mich, wie man prüft, ob Class1 DoSomething2 (int a) von Class2 mit Moq, auf bestimmten Testfällen in C# aufruft?Wie testen, ob Methode von einer Klasse, Methode von der anderen Klasse mit Moq ruft?

+3

Zeigen Sie, was Sie versucht haben, so weit und wo Sie haben Schwierigkeiten in ein [mcve]. Auf diese Weise zeigt sich, dass einige Anstrengungen unternommen wurden, um es herauszufinden, anstatt nur mir zu zeigen, wie es geht. – Nkosi

Antwort

0

Wenn Sie Class1 gehen zu testen, sollten Sie es Abhängigkeiten verspotten, in diesem Fall Interface2 wie diese

//First create the mock 
var mocked = new Mock<Interface2>(); 

//then setup how the mocked interface methods should work 
mocked.Setup(a=>a.DoSomething2(It.IsAny<int>()).Returns(null); 

//Add the mocked object to the Class1 constructor 
var class1 = new Class1(mocked.Object); 

//then Act on your class1 which will use your mocked interface 
class1.DoSomething1(1); 
+0

Vielen Dank, das Problem lag im Setup. Ich habe nicht "It.IsAny " – hurms

+0

@ hurms verwendet Warum haben Sie meine Antwort als richtig markiert und dann entfernen? habe ich nicht die richtige lösung geliefert? –

+0

Ich weiß es nicht. Ich habe gerade richtig geklickt für die andere Antwort, und dann hat es das, was ich annehme, deaktiviert. Mein Fehler. – hurms

0

Wie Sie Interface2 zu Class1 Konstruktor injizieren, so müssen Sie es mit Moq verspotten. Dann müssen Sie DoSomething1 ausführen und die Methode Verify aufrufen, um sicherzustellen, dass die Methode Interface2 einmal aufgerufen wurde. Wenn es nicht war - der Test wird fehlschlagen. Beispiel ist unten:

[TestFixture] 
public class Class1Tests 
{ 
    [Test] 
    public void DoSomething1_DoSomething2IsCalled() 
    { 
     //Setup 
     //create a mock for Class1 dependency 
     var mock = new Mock<Interface2>(); 
     var sut = new Class1(mock.Object); 

     //execute 
     sut.DoSomething1(It.IsAny<int>()); 

     //test 
     mock.Verify(m => m.DoSomething2(It.IsAny<int>()), Times.Once()); 
    } 
} 
+0

Bitte versuchen Sie zu vermeiden, nur Code als Antwort zu verlieren und versuchen Sie zu erklären, was es macht und warum. Ihr Code ist möglicherweise nicht offensichtlich für Personen, die nicht über die entsprechende Codiererfahrung verfügen. Bitte bearbeiten Sie Ihre Antwort, um [Klarstellung, Kontext und versuchen Sie, Einschränkungen, Annahmen oder Vereinfachungen in Ihrer Antwort zu erwähnen.] (Https://stackoverflow.com/help/how-to-answer) –

+0

Vielen Dank für das Feedback @Sam Onela . Gedankenkommentare sollten ausreichen. Wird ein Update – Artem

+0

Ich verwende Verify-Methode, jetzt habe ich eine andere Frage. Wenn ich es mit schlechten Parameter testen möchte, so wird die zweite Methode nie aufgerufen, wie sollte ich die erste Methode implementieren? Ich habe die Methode implementiert, so dass es eine Ausnahme auslöst, wenn der Parameter falsch ist. Wenn ich den Komponententest starte, wird immer eine Ausnahme ausgelöst. Es gibt mir nie grünes Licht, dass die zweite Methode nicht einmal genannt wird. Verwendet mocked.Verify (a => a.DoSomething2 (a), Times.Never()); Vielen Dank für Ihre Antwort. – hurms

Verwandte Themen