2011-11-19 64 views
0

Moq存储库设置FindBy方法Im新moq并一直在努力满足以下要求。使用Func <>

我曾嘲笑称为_mockedThingsList

列表清单,我想我的起订量的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(); 
    } 
} 
+0

你在挣扎,因为你正在测试值而不是契约。如果你想测试值,使用假。 –

+0

对不起,我新来的Moq和林不知道你的意思。你能否详细说明一下? mayeb举一个快速的例子? – John

+0

您能否提供您正在收到的异常消息/详细信息? –

回答

5

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

+0

我得到了相同的氛围。我的假设是他过于嘲笑,因为他试图在集成层面进行测试,同时仍然通过“单元”的镜头查看他的测试。 –

+0

我不觉得这是TDD。 –

+0

好吧,根据你的意见和其他反馈,我已决定走假道路。我创建了一个包含mocks列表的存储库的具体实现。这给了我所需的功能。这种方法是更TDD还是我再次通过在我的列表中使用模拟它太远? – John

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)); 
+0

.Returns(new [] {thingA,thingB}; –

+0

你是部分权利,下面的工作,但不是我之后 'code'mockRep.Setup(moq => moq.FindBy(It.IsAny >())) 。返回(新列表(){_mockedThingsList [0],_mockedThingsList [1]}); 我是想查询与LINQ查询_mockedlist在我的服务 – John

+0

我的服务包含以下代码 公开名单 GetThings1(){ 回报 _repository.FindBy(Y => y.ThingType == enumThingType.WhatEver ).ToList(); } 这将是对moq存储库调用的linq,因此从我的_mockThingsList中读取 – John

相关问题