2009-10-26 5 views
2

Je suis nouveau à Moq, donc j'espère qu'il me manque quelque chose ici. Pour une raison quelconque, j'obtiens une exception TargetParameterCountException.Utilisation de Moq: objet mock jetant 'TargetParameterCountException'

Pouvez-vous voir ce que je fais mal? Des questions? S'il vous plaît demander. :)

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

Voici la méthode HasStudent de persistance:

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

Qu'est-ce qui se passe si vous Substitue It.IsAny pour It.IsAny ()? – Kirschstein

+0

@Kirschstein: qui ne compilera pas –

Répondre

3

Quelle est la signature de la méthode FindAll? Votre référentiel a-t-il surchargé les méthodes FindAll? Si oui, peut être l'explication. Votre expression lamda peut compiler en plusieurs types différents, tels que Predicate<Student>, Func<Student, bool> ou Expression<Func<Student, bool>>. Je ne suis pas sûr de comprendre exactement ce qui se passe, mais TargetParameterCountException est un type qui appartient à l'espace de noms System.Reflection, ce qui indique que Moq essaie en quelque sorte d'invoquer une méthode avec le mauvais nombre d'arguments. La cause la plus courante pour c'est lorsque les membres sont surchargés et la mauvaise surcharge finit par être invoquée ...

+0

Ahhhh ... Je vois. Il y a aussi une surcharge FindAll(). –

+1

Maintenant, comment puis-je contourner cela sans supprimer le FindAll()? –

+0

également, la signature est celle-ci: IQueryable FindAll (prédicats prédicat) {} –

5

C'est bien en retard à la question, mais pour le bien de Googlers ...

J'ai un très cas similaire, et je ne peux pas expliquer pourquoi, mais le problème semble être en appelant AsQueryable sur une liste générique dans le .Returns(). Le problème a été résolu en configurant la liste comme IQueryable avant la configuration fictive. Quelque chose comme ...

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

+1 bon point, semble contre-intuitif ne pensez-vous? –

+0

Avait ce problème aussi et votre poste m'a aidé beaucoup. Merci m8! –

+0

Oui, cela a fonctionné pour moi aussi. – David