Pregunta

Soy nuevo en Moq, así que espero que solo me falte algo aquí. Por alguna razón, recibo una TargetParameterCountException.

¿Puedes ver lo que estoy haciendo mal? ¿Alguna pregunta? Por favor pregunte. :)

Aquí está mi código:

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

Aquí está el método HasStudent de 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;
  }
¿Fue útil?

Solución

¿Cuál es la firma del método FindAll? ¿Su repositorio ha sobrecargado los métodos FindAll?

Si es así, esa puede ser la explicación. Su expresión lamda puede compilarse en varios tipos diferentes, como Predicate<Student>, Func<Student, bool> o Expression<Func<Student, bool>>.

No estoy seguro de entender exactamente lo que está sucediendo, pero TargetParameterCountException es un tipo que pertenece al espacio de nombres System.Reflection, por lo que eso indica que Moq de alguna manera intenta invocar un método con el número incorrecto de argumentos. La causa más común de esto es cuando los miembros están sobrecargados y la sobrecarga incorrecta termina siendo invocada ...

Otros consejos

Esto es muy tarde para la pregunta, pero por el bien de Googlers ...

Tengo un caso muy similar y no puedo explicar por qué, pero el problema parece ser llamar a AsQueryable en una Lista genérica dentro de .Returns (). El problema se resolvió configurando la Lista como IQueryable antes de la configuración simulada. Algo así como ...

var fakeList = new List<foo>.AsQueryable();
...
mockRepository.Setup(r => r.FindAll<foo>(It.IsAny<foo>()))
                            .Returns(fakeList)
                            .Verifiable();
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top