标签:unit-testing moq c lambda visual-studio
我正在尝试使用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
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。