2010-12-13 37 views
2

過去一週左右我一直在使用Moq,直到今天還沒有任何問題。我遇到了VerifyAll()正確匹配我的模擬設置的問題。在Moq中匹配設置的問題

我目前正在爲我的應用程序的API編寫單元測試。這裏的應用程序是如何構成的:

API <==> Service <==> DAO <==> Database

考慮到這一點,我嘲笑了服務對象,然後用嘲笑的服務構建的API對象。到目前爲止,我已經寫了大量的單元測試。

我有兩個實例變量是這樣的:

private Api _api; 
private Mock<IHibernateService> mockService; 

我的設置方法初始化這些:

[SetUp] 
public void DoSetupTasks() 
{ 
    mockService = new Mock<IHibernateService>(); 
    _api = new Api(mockService.Object); 
} 

這裏是失敗的單元測試:

[Test] 
    public void TestSearchOnAllProperties() 
    { 
     mockService 
      .Setup(service => service.LoadAll(It.IsAny<Type>())) 
      .Returns(new DomainBase[0]); 

     var dmbs = _api.SearchOnAllProperties("search term", typeof(DomainBase)); 

     mockService.VerifyAll(); 
    } 

API的SearchOnAllProperties()方法隨後將調用服務的LoadAll()方法(當然有一些額外的邏輯),所以我想驗證它被正確調用。爲了澄清,這裏的LoadAll()是如何被稱爲SearchOnAllProperties()

public IEnumerable<DomainBase> SearchOnAllProperties(string searchTerm, Type type) 
{ 
    foreach (DomainBase dmb in _hibernateService.LoadAll(type)) 
    { 
     // additional logic 
    } 
} 

然而,當我運行單元測試,我得到一個MockVerificationException指出指定設置不匹配。我無法弄清楚爲什麼它應該調用服務的方法LoadAll()

回答

0

一個可能的原因是,在調用此特定測試方法之前的某個時間點,mockService正被分配給Mock<IHibernateService>的新實例。如果是這種情況,那麼這個測試方法將在錯誤的實例上調用Setup,這會產生這個異常。

一個快速的方法來測試,這將是利用當地mockServiceapi變量,看看測試仍然失敗:

[Test] 
public void TestSearchOnAllProperties() 
{ 
    var localMockService = new Mock<IHibernateService>(); 
    var localApi = new Api(localMockService.Object); 

    localMockService 
     .Setup(service => service.LoadAll(It.IsAny<Type>())) 
     .Returns(new DomainBase[0]); 

    var dmbs = localApi.SearchOnAllProperties("search term", typeof(DomainBase)); 

    localMockService.VerifyAll(); 
} 

HTH

+0

我應該澄清,我曾嘗試初始化mockService和_api在本地的測試用例中,問題仍然存在。 – 2010-12-15 05:11:52

+0

@Tyler,我複製了你的代碼並且通過了,所以它不應該是Moq的問題。你的'Api'類是否可以將其內部的'IHibernateService'變量賦值給一個新的實例? – 2010-12-15 16:38:11

+0

當匹配的方法調用是另一個表達式的一部分時,看起來像是一個問題,例如:'foreach(在_hibernateService.GetAllDomainTypes()中鍵入t。 ==「DomainBase」&&!t.IsAbstract)''''''''''''''''''''我已經設置了嚴格的模擬,但沒有例外,看起來沒有方法被調用。 – 2010-12-16 18:02:48