Moq + 유닛 테스트 - 시스템반사.TargetParameterCountException: 매개 변수 수가 일치하지 않습니다.
다중 파라미터 함수와 함께 람다를 사용하려고 하는데 Moq는 실행 시 이 예외를 발생시킵니다.mock.Object.Convert(value, null, null, null);선.
시스템. 리플렉션.TargetParameterCountException: 매개 변수 수가 일치하지 않습니다.
코드는 다음과 같습니다.
var mock = new Mock<IValueConverter>();
mock.Setup(conv => conv.Convert(It.IsAny<Object>(), It.IsAny<Type>(),
It.IsAny<Object>(), It.IsAny<CultureInfo>())).Returns((Int32 num) => num + 5);
var value = 5;
var expected = 10;
var actual = mock.Object.Convert(value, null, null, null);
그것을 구현하는 적절한 방법은 무엇입니까?
네 거야Returns절을 클릭합니다.설정하는 4개의 모수 방법이 있지만 1개의 모수 람다만 사용하고 있습니다.다음을 문제없이 실행했습니다.
[TestMethod]
public void IValueConverter()
{
var myStub = new Mock<IValueConverter>();
myStub.Setup(conv => conv.Convert(It.IsAny<object>(), It.IsAny<Type>(), It.IsAny<object>(), It.IsAny<CultureInfo>())).
Returns((object one, Type two, object three, CultureInfo four) => (int)one + 5);
var value = 5;
var expected = 10;
var actual = myStub.Object.Convert(value, null, null, null);
Assert.AreEqual<int>(expected, (int) actual);
}
예외는 없습니다. 테스트에 합격했습니다.
OP에 대한 답변이 아니라 향후 검색자에게도 해당될 수 있습니다.
저는 한 잔 했다.Callback설정 중인 메서드의 시그니처와 일치하지 않음
Mock
.Setup(r => r.GetNextCustomerNumber(It.IsAny<int>()))
.Returns(AccountCounter++)
.Callback<string, int>(badStringParam, leadingDigit =>
{
// Doing stuff here, note that the 'GetNextCustomerNumber' signature is a single int
// but the callback unreasonably expects an additional string parameter.
});
이것은 일부 리팩터링의 결과이며 리팩터링 툴은 물론 리팩터링이Callback서명이 올바르지 않습니다.
아마 네가 지나가고 있기 때문일 거야.null그렇지만It.IsAny<Object>()기다리고 있다object제외하고null다음을 실행하면 어떻게 됩니까?
var actual = mock.Object.Convert(value, new object(), typeof(object), CultureInfo.CurrentCulture);
이건 그냥 내 생각일 뿐이야. 내가 코뿔소를 더 잘 알아.모크스.
내 두 번째 추측:
다운로드와 함께 제공되는 Moq.chm을 보고,
를 사용하고 있습니다.Setup(Expression<Action<T>>)에의 콜에 대해서, 「시뮬레이션 된 타입의 셋업을 지정합니다.void메서드」를 참조해 주세요.
당신은 te를 원한다Setup<TResult>(Expression<Func<T,TResult>>)"값 반환 메서드에 대한 호출에 대해 조롱된 유형의 설정을 지정합니다."
그럼, 다음을 시험해 봅시다.
mock.Setup<Int32>(
conv => {
conv.Convert(
It.IsAny<Object>(),
It.IsAny<Type>(),
It.IsAny<Object>(),
It.IsAny<CultureInfo>());
return num + 5;
});
내 경우엔, 내 타입이Returns<>는 출력 타입이지만 실제로는 입력 타입입니다.
그래서 만약 네가 방법을 가지고 있다면
public virtual string Foo(int a, int b) { ... }
올바른 절은.Returns<int, int>(...),것은 아니다..Returns<string>(...)저도 처음에는 그렇게 생각했어요
처음에 같은 입력과 반환 타입의 함수를 테스트하고 있었기 때문입니다.예를 들어,public virtual string Foo(string a).
언급URL : https://stackoverflow.com/questions/7714551/moq-unit-testing-system-reflection-targetparametercountexception-parameter
'programing' 카테고리의 다른 글
| 문자열의 마지막 문자 삭제 (0) | 2023.04.09 |
|---|---|
| 어레이 길이를 가져오시겠습니까? (0) | 2023.04.09 |
| Python의 순환 목록 반복기 (0) | 2023.04.09 |
| 저장된 csv에 인덱스를 생성하는 판다를 피하는 방법 (0) | 2023.04.09 |
| npm을 사용하여 TypeScript를 최신 버전으로 업데이트하려면 어떻게 해야 합니까? (0) | 2023.04.04 |