programing

MOQ-인수 값 (다중 인수)을 기반으로 메서드 설정

copyandpastes 2021. 1. 18. 22:15
반응형

MOQ-인수 값 (다중 인수)을 기반으로 메서드 설정


다음과 같이 정의 된 인터페이스가 있습니다.

interface IMath
{
 AddNumbersBetween(int lowerVal, int upperVal);
}

위의 기본 Moq를 다음과 같이 설정할 수 있습니다.

Mock<IMath> mock = new Mock<IMath>();    
mock.Setup(m => m.AddNumbersBetween(It.IsAny<int>(), It.IsAny<int>()));

불러라

mock.Object.AddNumbersBetween(1,4);

그런 다음 호출되었는지 확인하십시오.

mock.Verify(m => m.AddNumbersBetween(1,4), Times.AtleastOnce());

UpperVal이 lowerVal보다 낮 으면 예외가 발생하도록 AddNumbersBetween 메서드를 설정하는 방법을 알아낼 수 없습니다.

mock.Object.AddNumbersBetween(4,1);//should throw an exception

기본적으로 다음과 같은 것을 찾고 있습니다.

mock.Setup(foo => foo.AddNumbersBetween("arg1 is higher than arg2")).Throws<ArgumentException>();

나는 이것이 일년 된 것을 알고 있지만 최소한 최신 버전의 Moq에서 여러 매개 변수를 사용하는 방법을 찾았습니다.

mock.Setup(x => x.Method(It.IsAny<int>(), It.IsAny<int>()))
    .Returns<int, int>((a, b) => a < b);

단일 인수 메서드의 경우 가장 깨끗한 방법은 다음과 같습니다.

mock.Setup(foo => foo.Submit(IsLarge())).Throws<ArgumentException>();
...
public string IsLarge() 
{ 
  return Match<string>.Create(s => !String.IsNullOrEmpty(s) && s.Length > 100);
}

메서드에 여러 인수가있는 경우에는 적용 할 수 없습니다. 달성하고자하는 것을 모방하는 사용할 수있는 '해결 방법'이 여전히 있습니다.

/// <summary>
/// Tests if a moq can send an exception with argument checking
///</summary>
[TestMethod]
public void TestException()
{
    Mock<IMath> mock = new Mock<IMath>();
    mock.Setup(m => m.AddNumbersBetween(It.IsAny<int>(), It.IsAny<int>()));

    mock.Setup(foo => foo.AddNumbersBetween(It.IsAny<int>(), It.IsAny<int>()))
        .Callback<int, int>((i, j) => CheckArgs(i, j));

    try
    {
        mock.Object.AddNumbersBetween(1, 2);
    }
    catch (Exception ex)
    {
        // Will not enter
        Console.WriteLine("Exception raised: {0}", ex);
    }
    try
    {
        mock.Object.AddNumbersBetween(2, 1);
    }
    catch (Exception ex)
    {
        // Will enter here, exception raised
        Console.WriteLine("Exception raised: {0}", ex);
    }
}

private bool CheckArgs(int i, int j)
{
    if( i > j)
        throw new ArgumentException();
    return true;
}

참조 URL : https://stackoverflow.com/questions/4080939/moq-setting-up-a-method-based-on-argument-values-multiple-arguments

반응형