使用Moq:模拟对象抛出“TargetParameterCountException”

3

我对Moq比较陌生,希望我只是遗漏了一些东西。出现了目标参数计数异常的问题。

你能看出我做错了什么吗?有任何疑问请问:)

这是我的代码:

[Test]
  public void HasStudentTest_SaveToRepository_Then_HasStudentReturnsTrue()
  {
     var fakeStudents = new List<Student>();
     fakeStudents.Add(new Student("Jim"));

     mockRepository.Setup(r => r.FindAll<Student>(It.IsAny<Predicate<Student>>()))
                                .Returns(fakeStudents.AsQueryable<Student>)
                                .Verifiable();

     // in persistence.HasStudent(), repo.FindAll(predicate) is throwing 
     // 'TargetParameterCountException' ; not sure why
     persistence.HasStudent("Jim");
     mockRepository.VerifyAll();
  }

以下是 Persistence 中的 HasStudent 方法:

public bool HasStudent(string name)
  {
     // throwing the TargetParameterCountException
     var query = Repository.FindAll<Student>(s => s.Name == name); 

     if (query.Count() > 1)
        throw new InvalidOperationException("There should not be multiple Students with the same name.");

     return query.Count() == 1;
  }

如果您将 It.IsAny<Predicate...> 替换为 It.IsAny<object>() 会发生什么? - Kirschstein
@Kirschstein:那个不会编译。 - Alex Baranosky
2个回答

6
这个问题的答案可能有点晚了,但为了那些通过谷歌搜索得到这个页面的人们,我想分享一下我的类似经历。我遇到了一个非常相似的问题,但是我无法解释为什么会出现这种情况。问题似乎是在 .Returns() 中调用泛型 List 的 AsQueryable 方法引起的。通过在模拟设置之前将 List 设置为 IQueryable,问题得以解决。大致如下:
var fakeList = new List<foo>.AsQueryable();
...
mockRepository.Setup(r => r.FindAll<foo>(It.IsAny<foo>()))
                            .Returns(fakeList)
                            .Verifiable();

我也遇到了这个问题,你的帖子帮了我很多。谢谢啊! - Mikael Johansson

4
什么是FindAll方法的签名?您的存储库是否有重载的FindAll方法?
如果是这样,那可能就是解释。您的Lambda表达式可以编译成几种不同的类型,例如Predicate、Func或Expression>。
我不确定我完全理解发生了什么,但TargetParameterCountException是属于System.Reflection命名空间的一种类型,因此这表明Moq以某种方式尝试调用具有错误参数数量的方法。最常见的原因是成员重载并且错误的重载被调用...

啊哈……我明白了。还有一个FindAll()的重载。 - Alex Baranosky
1
现在我该如何解决这个问题,而不必删除FindAll()函数呢? - Alex Baranosky
或者:IQueryable<T> FindAll<T>() {} - Alex Baranosky
嗯...在这种情况下,您的设置看起来非常明确,所以我不太明白发生了什么。这两种方法都是虚拟/抽象的吗? - Mark Seemann
它们既不是虚拟的也不是抽象的。 - Alex Baranosky
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接