需要使用MOQ语法的一个很好的解释

时间:2014-02-14 09:08:10

标签: c# linq moq

我似乎在通过示例获取MOQ语法时遇到问题。除了MOQ网站之外,我想建议在哪里查看模拟各种界面的用法。

例如,我想了解我是如何继续模拟这个或那个接口方法,并且能够解决为什么开发人员写这样的事情:

        daoMock.Setup(d => d.Get(It.Is<Expression<Func<ConfigurationEntity, bool>>>(e => ExpressionMatchesEntityWithKey(e, TestKey))))
               .Returns(new List<ConfigurationEntity> {configEntity});

提前感谢!

1 个答案:

答案 0 :(得分:1)

@jakub建议的github页面实际上是一个很好的起点。

无论哪种方式,我都会解释您发布的示例。 假设你有这个界面和这个设置:

public interface IDao
{
    IEnumerable<ConfigurationEntity> Get(Expression<Func<ConfigurationEntity, bool>> expression) {...}
}

var daoMock = new Mock<IDao>();

daoMock.Setup(d => d.Get(It.Is<Expression<Func<ConfigurationEntity, bool>>>(e => ExpressionMatchesEntityWithKey(e, TestKey))))
               .Returns(new List<ConfigurationEntity> {configEntity});

此设置告诉mock在时返回包含configEntity 的列表:

  • 调用Get方法
  • ,参数类型为Expression<Func<ConfigurationEntity, bool>>
  • ExpressionMatchesEntityWithKey(e, TestKey)(其中e是作为参数传入的表达式)返回true。

所以,基本上,当你在模拟对象上调用Get方法时,Moq将检查参数是否是正确的类型,检查ExpressionMatchesEntityWithKey(e, TestKey)是否返回true,然后返回一个包含configEntity

默认情况下,如果不满足任何这些要求,模拟对象将返回IEnumerable<ConfigurationEntity>的默认值,即null

现在,您可以检索模拟对象并随意执行任何操作。

IDao dao = daoMock.Object;