2010-12-13 84 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