2012-02-03 160 views
57

我對C#中的單元測試以及學習使用Moq相當陌生。以下是我正在測試的課程。使用Moq驗證方法調用

class MyClass 
{ 
    SomeClass someClass; 
    public MyClass(SomeClass someClass) 
    { 
     this.someClass = someClass;  
    } 

    public void MyMethod(string method) 
    { 
     method = "test" 
     someClass.DoSomething(method); 
    } 
} 

class Someclass 
{ 
    public DoSomething(string method) 
    { 
     // do something... 
    } 
} 

下面是我的TestClass:

class MyClassTest 
{ 
    [TestMethod()] 
    public void MyMethodTest() 
    { 
     string action="test"; 
     Mock<SomeClass> mockSomeClass = new Mock<SomeClass>(); 
     mockSomeClass.SetUp(a => a.DoSomething(action)); 
     MyClass myClass = new MyClass(mockSomeClass.Object); 
     myClass.MyMethod(action); 
     mockSomeClass.Verify(v => v.DoSomething(It.IsAny<string>())); 
    } 
} 

我得到以下異常:

Expected invocation on the mock at least once, but was never performed 
No setups configured. 
No invocations performed.. 

我只是想驗證該方法 「的MyMethod」 是被稱爲與否。我錯過了什麼嗎?

在此先感謝!

+1

如果'SomeClass'沒有'MyMethod(string)'的定義,那看起來好像沒有。 – 2012-02-03 23:08:26

+0

對不起..我編輯了我的問題.. – user591410 2012-02-03 23:17:27

+1

你在正確的軌道上,但在發佈的代碼中有錯誤。它不會編譯 - 在Someclass上封裝,在DoSomething上無效返回。之後,您需要公共訪問權限,然後使DoSomething虛擬。簡而言之,您的生產代碼中可能也存在一個錯誤。 – TrueWill 2012-02-04 01:37:26

回答

81

您正在檢查錯誤的方法。 Moq要求你設置(然後選擇驗證)依賴類中的方法。

你應該更喜歡這樣做的事情:

class MyClassTest 
{ 
    [TestMethod] 
    public void MyMethodTest() 
    { 
     string action = "test"; 
     Mock<SomeClass> mockSomeClass = new Mock<SomeClass>(); 

     mockSomeClass.Setup(mock => mock.DoSomething()); 

     MyClass myClass = new MyClass(mockSomeClass.Object); 
     myClass.MyMethod(action); 

     // Explicitly verify each expectation... 
     mockSomeClass.Verify(mock => mock.DoSomething(), Times.Once()); 

     // ...or verify everything. 
     // mockSomeClass.VerifyAll(); 
    } 
} 

換句話說,你是驗證調用MyClass#MyMethod,類肯定會在這個過程中調用SomeClass#DoSomething一次。請注意,您不需要參數Times;我只是在展示它的價值。

+0

對不起,我用正確的方法編輯了我的問題。正如你所提到的,我先嚐試了SetUp,然後進行了驗證。它仍然給我同樣的例外。 – user591410 2012-02-03 23:23:30

+0

我用你提出的建議更新了我的問題,但即使這也給了我同樣的例外..請指教。 – user591410 2012-02-03 23:31:42

+0

明白了..謝謝..我在設置時錯誤地設置了方法的參數。 – user591410 2012-02-04 17:43:09