Подтвердить что ты не робот

Несколько Moq It.Is <string>() Соответствующие аргументы

С 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 присваивает второй оператор, а не оценивает его по существу.

4b9b3361

Ответ 1

Разве это не смущает? Вы пытаетесь высмеять метод GetUser, но вы установите свойство Returns для возвращаемого значения этой функции. Вы также хотите указать свойство возвращаемого типа на основе метода издевательства.

Здесь более понятным способом:

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";
}

Ответ 2

Если вы хотите ограничить ввод только "Джо" и "Трейси", вы можете указать несколько условий в It.Is<T>(). Что-то вроде

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

Ответ 3

Принудительная настройка вызывает отмену предыдущих настроек.

Вы можете использовать свой аргумент в обратном обратном вызове:

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>(...).

Ответ 4

Пожалуйста, проверьте Введение в 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");