2017-05-24 125 views
2

如何模擬一個類的成員變量?模擬成員變量

看起來這個FooA()永遠不會被調用。

注:我在MOQ初學者(和生鏽的C#),所以請與我;-)承擔

未處理的異常:Moq.MockVerificationException:以下 設置不匹配:一個IA => a.FooA()

這裏是源代碼:

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

你沒有使用'mockA'您在main方法創建,而不是類'B'總是創建本身就是類「A」的新實例。所以這個方法調用你設置'mockA'確實從來沒有做過,這就是驗證失敗的原因。 – bassfader

+0

這是因爲你手動創建了一個'B'的新實例,並且不使用模擬。您需要注入依賴關係。 – Nkosi

回答

2

B以其原始形式被緊緊地耦接至依賴關係IA這使得在測試時很難模擬。

重構B通過構造函數注入依賴於IA。 (Explicit Dependencies Principle

class B { 
    IA a; 

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

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

現在注入測試嘲笑的依賴和驗證行爲

[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(); 
}