2009-10-26 7 views
2

Я новичок в Moq, так что, надеюсь, я просто что-то пропустил здесь. По какой-то причине я получаю исключение TargetParameterCountException.Использование Moq: mock object throwing '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 от упорства:

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

Что произойдет, если вы substitue It.IsAny <Предикат ...> для It.IsAny ()? – Kirschstein

+0

@ Киршштейн: это не скомпилируется –

ответ

3

Что такое сигнатура метода FindAll? В вашем репозитории перегружены методы FindAll?

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

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

+0

Ahhhh ... Понятно. Существует также перегрузка FindAll(). –

+1

Теперь, как я могу обойти это без удаления FindAll()? –

+0

также, подпись это: IQueryable FindAll (Predicate предикат) {} –

5

Это путь поздно вопрос, но ради Googlers ...

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

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

+1 хороший момент, кажется, счетчик интуитивно не думает? –

+0

Если бы эта проблема также и ваше сообщение мне очень помогли. Спасибо m8! –

+0

Да, это сработало и для меня. – David

Смежные вопросы