MOQ 사용 : Mock Object Throwing 'TargetParameterCountexception'
-
06-07-2019 - |
문제
나는 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();
}
지속성의 역할 방법은 다음과 같습니다.
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;
}
해결책
Findall 방법의 서명은 무엇입니까? 저장소에 FindAll 메소드가 과부하 되었습니까?
그렇다면 5월 설명이 되십시오. Lamda 표현식은 다음과 같은 여러 가지 유형으로 컴파일 할 수 있습니다. Predicate<Student>
, Func<Student, bool>
또는 Expression<Func<Student, bool>>
.
나는 무슨 일이 일어나고 있는지 잘 이해하지 못하지만 TargetParameterCountexception은 System.reflection 네임 스페이스에 속하는 유형이므로 MOQ는 어떻게 든 잘못된 수의 인수가있는 방법을 호출하려고한다는 것을 나타냅니다. 가장 흔한 원인은 회원이 과부하가 걸리고 잘못된 오버로드가 발생했을 때입니다 ...
다른 팁
이것은 질문에 늦었지만 Googlers를 위해 ...
나는 매우 비슷한 사례가 있고 이유를 설명 할 수 없지만 .returns () 내부의 일반 목록에서 문제를 해결할 수있는 문제가있는 것 같습니다. 모의 설정 전에 목록을 iqueryable로 설정하여 문제가 해결되었습니다. ... 같은 ...
var fakeList = new List<foo>.AsQueryable();
...
mockRepository.Setup(r => r.FindAll<foo>(It.IsAny<foo>()))
.Returns(fakeList)
.Verifiable();
제휴하지 않습니다 StackOverflow