2017-05-24 1 views
2

Wie kann ich eine Member-Variablen einer Klasse spotten?Mock-Member-Variablen

Es scheint, dass diese FooA() nie aufgerufen wird.

Hinweis: Ich bin Anfänger in moq (und rostig in C#), so bitte Geduld mit mir ;-)

Unbehandelte Ausnahme: Moq.MockVerificationException: Die folgenden Setups nicht angepasst wurden: IA a => (a.FooA)

Hier ist der Quellcode:

using Moq; 

namespace TestMock 
{ 
    interface IA { 
     void FooA(); 
    } 
    class A : IA { 
     public void FooA() { } 
    } 

    class B { 
     public void FooB() { 
      a.FooA(); 
     } 
     IA a = new A(); 
    } 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      // Arrange 
      var mockA = new Mock<IA>(); 
      mockA.Setup(a => a.FooA()); 
      var mockB = new Mock<B>(); 

      // Act 
      B b = new B(); 
      b.FooB(); 

      // Assert 
      mockA.VerifyAll(); 
     } 
    } 
} 
+0

Sie verwenden nicht die 'mockA' Sie in Ihrem Haupt-Methode zu erstellen, anstatt die Klasse 'B' erzeugt immer eine neue Instanz der Klasse "A" an sich. Daher wird die Methodenaufruf-Einstellung für 'mockA' in der Tat nie gemacht, weshalb die Verifizierung fehlschlägt. – bassfader

+0

Das liegt daran, dass Sie manuell eine neue Instanz von "B" erstellen und den Mock nicht verwenden. Sie müssten die Abhängigkeiten injizieren. – Nkosi

Antwort

2

B in seiner ursprünglichen Form ist eng gekoppelt Abhängigkeit IA, die es schwierig macht, beim Testen zu verspotten.

Refactor B von über Konstruktor Injektion abhängen. (Explicit Dependencies Principle)

class B { 
    IA a; 

    public B(IA a) { 
     this.a = a; 
    } 

    public void FooB() { 
     a.FooA(); 
    } 
} 

nun die verspottete Abhängigkeit im Test injizieren und verifizieren Verhalten

[TestMethod] 
public void TestMoq() { 
    // Arrange 
    var mockA = new Mock<IA>(); 
    mockA.Setup(a => a.FooA()); 

    // Act 
    B b = new B(mockA.Object); 
    b.FooB(); 

    // Assert 
    mockA.VerifyAll(); 
}