Program Tip

다중 Moq It.Is

programtip 2020. 11. 18. 09:38
반응형

다중 Moq It.Is() 일치하는 인수


Moq에서 둘 이상의 일치 인수를 갖는 것이 유효합니까?

It.Is<string>() 

이 예에서는 mockMembershipService가 제공된 사용자에 따라 다른 ProviderUserKey를 반환하기를 원합니다.

mockMembershipService.Setup(
    x => x.GetUser(
      It.Is<string>(
        s => s.Contains("Joe")))
   .ProviderUserKey)
.Returns("1234abcd");


mockMembershipService.Setup(
  x => x.GetUser(
    It.Is<string>(
      s => s.Contains("Tracy")))
  .ProviderUserKey)
.Returns("5678efgh");

SetUp은 기본적으로 각각의 장점을 평가하는 대신 두 번째 문을 사용합니다.


혼란스럽지 않나요? GetUser 메서드를 모의하려고하지만 해당 함수의 반환 값 속성에 대한 반환을 설정했습니다. 또한 mocked 메서드를 기반으로 반환 유형의 속성을 지정하려고합니다.

더 명확한 방법은 다음과 같습니다.

mockMembershipService.Setup(x => x.GetUser(It.IsAny<string>())
                     .Returns<string>(GetMembershipUser);

멤버십 모의를 만드는 방법은 다음과 같습니다.

private MembershipUser GetMembershipUser(string s)
{
    Mock<MembershipUser> user =new Mock<MembershipUser>();
    user.Setup(item => item.ProviderUserKey).Returns(GetProperty(s));
    return user.Object;
}

그런 다음 해당 속성을 설정하는 방법을 작성합니다.

private string GetProperty(string s)
{
    if(s.Contains("Joe"))
        return "1234abcd";
    else if(s.Contains("Tracy"))
        return "5678efgh";
}

입력을 "Joe"및 "Tracy"로만 제한하려면에서 여러 조건을 지정할 수 있습니다 It.Is<T>(). 같은 것

mockMembershipService.Setup(x => x.GetUser(It.Is<String>(s => s.Contains("Joe") 
                                                         || s.Contains("Tracy")))
    .Returns<string>(/* Either Bartosz's or Ufuk's answer */);

Succesive Setup 호출은 이전 설정을 무효화합니다.

반환 콜백에서 인수를 사용할 수 있습니다.

mockMembershipService.Setup(x => x.GetUser(It.IsAny<string>()).ProviderUserKey).Returns<string>(s =>
{
    if(s.Contains("Joe"))
        return "1234abcd";
    else if(s.Contains("Tracy"))
        return "5678efgh";
});

전달 된 인수를 주장하는 것이 중요하다면 It.Is<string>(...)대신 It.IsAny<string>(...).


Moq 소개> 대응 인수 문서 확인하십시오 .

// matching Func<int>, lazy evaluated
mock.Setup(foo => foo.Add(It.Is<int>(i => i % 2 == 0))).Returns(true); 


// matching ranges
mock.Setup(foo => foo.Add(It.IsInRange<int>(0, 10, Range.Inclusive))).Returns(true); 


// matching regex
mock.Setup(x => x.DoSomething(It.IsRegex("[a-d]+", RegexOptions.IgnoreCase))).Returns("foo");

참고 URL : https://stackoverflow.com/questions/9122070/multiple-moq-it-isstring-matching-arguments

반응형