c#-带有lambda表达式的最小起订量?
作者:互联网
我正在尝试使用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表达式封装在对象内并传递到存储库中并执行查询的唯一选择吗?我不想只为我的测试环境更改代码,但是我也不想浪费时间尝试按照我的意愿来修改此代码.
解决方法:
这不需要太多测试.一个正确的测试将显示委派给FirstOrDefault的代码正在运行,然后所有后续测试都实际上在测试Func约束中的逻辑是否正确,而无需将其传递到存储库即可.
标签:unit-testing,moq,c,lambda,visual-studio 来源: https://codeday.me/bug/20191208/2090449.html