【发布时间】:2011-09-12 05:53:57
【问题描述】:
我正在尝试使用 Moq 4.0.10827(在 NuGet 上)测试应用程序服务,并且需要查询存储库:
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 表达式封装在对象中并传入存储库并让它执行查询的唯一选项是什么?我不想仅仅为了我的测试环境而改变我的代码,但我也不想浪费时间试图让这件事屈服于我的意愿。
【问题讨论】:
标签: c# visual-studio unit-testing lambda moq