【问题标题】:How do I build this Expression with Moq without getting a method group error?如何使用 Moq 构建此表达式而不会出现方法组错误?
【发布时间】:2012-12-24 19:33:18
【问题描述】:

我需要在给定集合上运行一个表达式,以确定代码中的表达式是否正确编写。为了示例,我将省略一些不必要的上下文,但如果有人需要它,只需发表评论,我将编辑问题并添加您需要的任何内容。

假设我有以下内容:

public interface IRepository
{
    IQueryable<T> Query<T>(Expression<Func<T, bool>> expression);
}

public class Repository : IRepository
{
    public IQueryable<T> Query<T>(Expression<Func<T, bool>> expression)
    {
        return _session.Query<T>(expression);
    }
}

我想编写如下规范:

internal class when_executing_some_query : given_some_repository_context
{
    Establish context = () => 
    {
         IQueryable<SomeObject> objects = new List<SomeObject>
         {
             SomeObject1,
             SomeObject2,
             SomeObject3,
         }.AsQueryable();

         _expectedList = new List<SomeObject>
         {
             SomeObject1,
             SomeObject2,
         };

         MockedRepository.Setup(x => x.Query<SomeObject>(Moq.It.IsAny<Expression<Func<SomeObject, bool>>>)
             .Callback<Expression<Func<SomeObject, bool>>>(expression => _actualExpression = expression);
    }

    Because of = () => _actualList = objects.Select(_actualExpression).ToList();

    It should_execute_on_queryable_and_return_the_expected_items = () => //compare _expectedList with _actualList
}

但是,我在Moq.It.IsAny&lt;Expression&lt;Func&lt;SomeObject, bool&gt;&gt;&gt; 上遇到了构建错误,说

“Project.Domain.IRepository.Query(System.Linq.Expressions.Expression>)”的最佳重载方法匹配有一些无效参数

参数 1:无法从“方法组”转换为
'System.Linq.Expressions.Expression>'`

【问题讨论】:

    标签: c# testing fluent-nhibernate moq mspec


    【解决方案1】:

    要修复此类错误,您需要调用该方法,而不是将其作为参数传递。只需将您的呼叫更改为:

    Moq.It.IsAny<Expression<Func<SomeObject, bool>>>
    

    到:

    Moq.It.IsAny<Expression<Func<SomeObject, bool>>>()
    

    注意括号。

    【讨论】:

      【解决方案2】:

      基于this answer,之后您似乎需要(),例如It.IsAny&lt;Expression&lt;Func&lt;SomeObject, bool&gt;&gt;&gt;()

      【讨论】:

        【解决方案3】:

        在您的设置中,您正在传递 SomeObject。
        在您的回调中,您要求提供 InstanceHealthReport。

        即使 InstanceHealthReport 是 SomeObject 的子类,我相信它们也需要在设置和回调中匹配。

        希望对您有所帮助。

        科林

        【讨论】:

        • 哎呀,这只是一个拼写错误,试图“通用”发布代码,感谢您指出这一点,我已经相应地进行了编辑
        【解决方案4】:

        您在上面包含了一个具体的存储库,但它从未在本规范中使用,所以我相信它只是为了举例。此外,该规范有一个模拟存储库和一个设置查询方法,但它从未被执行。该规范应该测试使用存储库的具体事物。然后您可以比较传入查询方法的表达式。

        表达式很棘手,但使用模拟更是如此。我所做的是使用 Moq 的验证,然后使用 Moq 的 Moq.It.Is 来确保验证仅在表达式匹配时通过。这是一个例子:

        _repo.Verify(x=>x.Query(Moq.It.Is<Expression<Func<SomeObject, bool>>>(exp=>exp.Compile().Invoke(_exampleSomeObject)));
        

        基本上,我在这里告诉 Moq,只有在给定的实际表达式适用于 _exampleSomeObject 时,验证才会通过。

        我在我的 Iphone 上打字,如果代码没有立即编译,我深表歉意。

        只是一个建议:你的因为部分应该表达一些导致结果的动作。现在,它看起来像你因为总线只处理以前的结果。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-08-22
          • 2020-11-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多