2011-06-10 76 views
3

我试图测试使用起订量4.0.10827应用服务(上的NuGet),需要查询资料库:Moq与lambda表达式?

public class MyService 
{ 
    Repository<MyObject> _Repo; 

    public MyObject Get (string SomeConstraint) 
    { 
     return _Repo 
      .GetTheFirstOneOrReturnNull (M => M.Constraint.Equals (
       SomeContraint, StringComparison.InvariantCultureIgnoreCase 
      )); // GetTheFirstOneOrReturnNull takes a Func<MyObject, bool> 
    } 
} 

如何复制与起订量lambda表达式?我不断收到“不支持的表达式”异常。

下面是我在做什么已经是一个想法:

[TestMethod] 
public void GetByMyConstraintShouldReturnWithMyObject() 
{ 
    // Arrange 
    const string MyConstraint = "Constraint"; 
    MyObject Expected = new MyObject { Constraint = MyConstraint }; 
    Mock<Repository<MyObject>> MockRepo = new Mock<Repository<MyObject>>(); 
    MockRepo.Setup (x => x.GetTheFirstOneOrReturnNull (M => M.Constraint.Equals (MyConstraint, StringComparison.InvariantCultureIgnoreCase))) 
      .Returns (Expected).Verifable(); 
    MyService Service = new MyService (MockRepo.Object); 

    // Act 
    MyObject Result = Service.Get (MyConstraint); 


    // Assert 
    Assert.AreSame (Expected, Result); 
    MockRepo.Verify(); 

} 

我在一些其他的答案环顾四周,但我真的不能做出来我在做什么错误(当然是“小白“与Moq)。我得出的结论是,这将是一个痛苦,但我有很多像这样的测试即将到来,并希望现在变得坚实,而不是稍后溺水。

将对象中的lambda表达式封装并传入存储库并让它执行查询的唯一选择是什么?我不想只为我的测试环境更改我的代码,但我不想浪费时间试图将这个东西屈服于我的意愿。

回答

1

这应该不需要太多测试。一个正确的测试将显示委托给FirstOrDefault的代码正在工作,然后所有后续测试都在测试Func约束中的逻辑是否正确,这可以在不将它传递到Repository的情况下完成。

+0

嗯......也许我的问题不是描绘我真正想要测试的东西。我可以不小心回购,这就是我嘲笑它的原因。我只想对服务进行测试。我用这个自定义存根(stub)代替了Moq。它似乎并没有很好地处理Func 。 – 2011-06-10 17:24:49

1

它看起来像你试图嘲笑一种扩展方法。您不能以这种方式模拟扩展方法,因为它们实际上并未在您嘲笑的类型上声明。

在这种情况下,由于您的存储库似乎代表一组东西,所以应该替换一个简单的硬编码集合。由于您没有提供IRepository的源代码,因此不清楚您可能会怎么做。

+0

我不知道如何添加存储库将在这里帮助。它只是返回第一个或默认值,在这种情况下,不管它的后备存储是什么(内存或数据库,并不重要)。 FirstOrDefault只是我在示例中给出的方法名称 - 它实际上由存储库类定义并采用Func 。 – 2011-06-10 06:00:31

1

我说你最好的选择是更新Repository有东西像FindByConstraint方法,所有你传递的是Constraint和回购本身是否FirstOrDefault()。我认为这样做的合理设计理由以及简单易用的测试 - 搜索是以不区分大小写的方式进行的,并且会很乐意返回null,您可以看到这是Repo应该制定的决策,而不是它的客户端。

我个人很难测试一个对象,意味着我的设计存在缺陷,我认为对象很容易测试是值得追求的。

+0

我全心全意地接受你最后的声明。我有计划重构并使存储库更友好,这只是我遇到的问题,我正在测试一些需要Func 的东西,并且我想知道Moq是否可以很好地使用它。 – 2011-06-10 06:04:08