Question

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;
  }
Was it helpful?

Solution

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...

OTHER TIPS

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();
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top