Moq中匹配设置的问题

时间:2010-12-13 19:29:08

标签: c# .net unit-testing nunit moq

过去一周左右我一直在使用Moq,直到今天才发生任何问题。我在让VerifyAll()与我的模拟设置正确匹配时遇到问题。

我目前正在为我的应用程序的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()方法。

1 个答案:

答案 0 :(得分: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