5

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

假设我有以下内容:

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<Expression<Func<SomeObject, bool>>>说的构建错误

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

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

4

4 回答 4

14

要修复这样的错误,您需要调用该方法,而不是将其作为参数传递。只需将您的电话更改为:

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

至:

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

注意括号。

于 2012-12-24T19:59:12.917 回答
3

基于这个答案,看起来你()以后需要,例如It.IsAny<Expression<Func<SomeObject, bool>>>()

于 2012-12-24T20:01:51.043 回答
0

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

表达式很棘手,但使用模拟更是如此。我所做的是使用 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 上打字,所以如果代码没有立即编译,我深表歉意。

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

于 2012-12-24T20:15:52.380 回答
0

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

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

希望有帮助。

科林

于 2012-12-24T20:25:35.463 回答