简体   繁体   中英

Using Moq: mock object throwing 'TargetParameterCountException'

I am new to Moq, so hopefully I am just missing something here. For some reason I am getting a TargetParameterCountException.

Can you see what I am doing wrong? Any questions? Please ask. :)

Here's my code:

[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();
  }

Here's the HasStudent method from Persistence:

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;
  }

This is way late to the question but for the sake of Googlers...

I have a very similar case, and I can't explain why, but the problem seems to be with calling AsQueryable on a generic List inside the .Returns(). Problem was solved by setting up the List as IQueryable before the mock setup. Something like...

var fakeList = new List<foo>.AsQueryable();
...
mockRepository.Setup(r => r.FindAll<foo>(It.IsAny<foo>()))
                            .Returns(fakeList)
                            .Verifiable();

What is the signature of the FindAll method? Does your repository have overloaded FindAll methods?

If so, that may be the explanation. Your lamda expression can compile into several different types, such as Predicate<Student> , Func<Student, bool> or Expression<Func<Student, bool>> .

I'm not sure I understand exeactly what is going on, but TargetParameterCountException is a type that belongs to the System.Reflection namespace, so that indicates that Moq somehow tries to invoke a method with the wrong number of arguments. The most common cause for that is when members are overloaded and the wrong overload ends up being invoked...

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM