编程语言
首页 > 编程语言> > c#-带有lambda表达式的最小起订量?

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