過去一週左右我一直在使用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()
。
我應該澄清,我曾嘗試初始化mockService和_api在本地的測試用例中,問題仍然存在。 – 2010-12-15 05:11:52
@Tyler,我複製了你的代碼並且通過了,所以它不應該是Moq的問題。你的'Api'類是否可以將其內部的'IHibernateService'變量賦值給一個新的實例? – 2010-12-15 16:38:11
當匹配的方法調用是另一個表達式的一部分時,看起來像是一個問題,例如:'foreach(在_hibernateService.GetAllDomainTypes()中鍵入t。 ==「DomainBase」&&!t.IsAbstract)''''''''''''''''''''我已經設置了嚴格的模擬,但沒有例外,看起來沒有方法被調用。 – 2010-12-16 18:02:48