Использование Moq: создание ложного объекта «TargetParameterCountException» - PullRequest
3 голосов
/ 26 октября 2009

Я новичок в Moq, так что, надеюсь, мне здесь чего-то не хватает. По какой-то причине я получаю TargetParameterCountException.

Вы видите, что я делаю не так? Любые вопросы? Пожалуйста спросите. :)

Вот мой код:

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

Вот метод HasStudent от 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;
  }

Ответы [ 2 ]

6 голосов
/ 24 ноября 2010

Это слишком поздно, но ради гуглов ...

У меня очень похожий случай, и я не могу объяснить, почему, но проблема, похоже, заключается в вызове AsQueryable для общего списка внутри .Returns (). Проблема была решена путем установки списка как IQueryable перед установкой макета. Что-то вроде ...

var fakeList = new List<foo>.AsQueryable();
...
mockRepository.Setup(r => r.FindAll<foo>(It.IsAny<foo>()))
                            .Returns(fakeList)
                            .Verifiable();
4 голосов
/ 26 октября 2009

Какая сигнатура метода FindAll? В вашем хранилище перегружены методы FindAll?

Если это так, то может быть объяснением. Ваше выражение лямда может быть скомпилировано в несколько различных типов, таких как Predicate<Student>, Func<Student, bool> или Expression<Func<Student, bool>>.

Я не уверен, что точно понимаю, что происходит, но TargetParameterCountException - это тип, который принадлежит пространству имен System.Reflection, поэтому он указывает, что Moq каким-то образом пытается вызвать метод с неправильным числом аргументов. Наиболее частая причина этого - перегрузка элементов и неправильная перегрузка в конечном итоге вызывается ...

...