我正在尝试使用NuGet上的Moq 4.0.10827来测试一个应用程序服务,并需要查询一个仓库:
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>
}
}
如何使用Moq复制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表达式封装在对象中,并传递存储库让它执行查询吗?我不想为我的测试环境改变自己的代码,但我也不想浪费时间试图强制其按照我的意愿工作。