使用Func<>的FindBy方法的Moq存储库设置

时间:2011-11-19 14:45:58

标签: c# tdd repository moq

我是新的moq,并一直在努力与以下。

我已经模拟了一个名为_mockedThingsList的List列表

我想Moq我的IRepository的FindBy基于我正在测试的服务中提供的linq查询从这个模拟列表返回。

我目前有什么抛出异常,如下所示。有什么不对吗?

mock.Setup(moq => moq.FindBy(It.IsAny<Func<IThing, bool>>()))
            .Returns((enumThingType tp) => _mockedThingsList.Where(x => x.ThingType == tp));

存储库界面如下所示:

interface IRepository<T>
{
    IEnumerable<T> FindAll();

    IEnumerable<T> FindBy(Func<T, bool> predicate);
    void Add(T item);
    void Remove(T item);

    bool Contains(T item);
    int Count { get; }
}

使用此模拟测试的服务

class ThingService
{
    private readonly IRepository<IThing> _repository;

    public ThingService(IRepository<IThing> repository)
    {
        _repository = repository;
    }


    public List<IThing> GetThings1()
    {
        return _repository.FindBy(y => y.ThingType == enumThingType.WhatEver).ToList();
    }

    public List<IThing> GetThings2()
    {
        return _repository.FindBy(y => y.Name == "What ever").ToList();
    }
}

2 个答案:

答案 0 :(得分:5)

我可能会错过一些背景,但在我看来,你过度嘲笑。嘲笑清单的目的是什么?您可以轻松返回一个具体列表并将其用于测试。

答案 1 :(得分:0)

我的解释可能有问题,但FindBy的签名正在返回IEnumerable。虽然在存根时,你正在返回一个代表。我想由于返回类型不匹配,您将遇到此问题。出于测试目的,为什么不从返回方法返回一些正确的列表,即

(moq => moq.FindBy(It.IsAny<Func<IThing, bool>>()))
            .Returns(// return a proper List of type T);
  

发生了'System.ArgumentException'类型的未处理异常   mscorlib.dll其他信息:对象类型   'System.Func`2 [ThingNamespace.IThing,System.Boolean]'不能   转换为'ThingNamespace.enumThingType'类型

这是事情。在FindBy上声明存根时,您将类型参数指定为:Func。现在在您的Returns方法中,输入参数应该完全相同。请尝试以下代码:

Func<IThing, bool> func => (IThing thing) => thing.ThingType == tp;

(moq => moq.FindBy(It.IsAny<Func<IThing, bool>>()))
            .Returns((func) => _mockedThingsList.Where(func));