programing

Moq + 유닛 테스트 - 시스템반사.TargetParameterCountException: 매개 변수 수가 일치하지 않습니다.

sourcejob 2023. 4. 9. 21:26
반응형

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

반응형