Как настроить метод дважды для разных параметров с помощью Moq

Я хотел бы установить метод с Moq дважды, но кажется, что последний переопределяет предыдущие. Вот моя первоначальная настройка:

string username = "foo";
string password = "bar";

var principal = new GenericPrincipal(
    new GenericIdentity(username),
    new[] { "Admin" });

var membershipServiceMock = new Mock<IMembershipService>();
membershipServiceMock.Setup(ms =>
    ms.ValidateUser(username, password)
).Returns(new ValidUserContext { 
    Principal = principal
});

Это работает нормально, но я хочу, чтобы это возвращало new ValidUserContext(), если имя пользователя или пароль отличается от переменных username и password, как указано выше. Чтобы сделать это, я добавил еще одну настройку, но на этот раз она переопределяет вышеуказанную и всегда применяет ее:

membershipServiceMock.Setup(ms =>
    ms.ValidateUser(It.IsAny<string>(), It.IsAny<string>())
).Returns(
    new ValidUserContext()
);

Какой самый элегантный способ обработки ситуации такого типа с Moq?

Редактировать

Я решил проблему с помощью описанного ниже подхода, но я думаю, что есть лучший способ справиться с этим:

var membershipServiceMock = new Mock<IMembershipService>();
membershipServiceMock.Setup(ms =>
    ms.ValidateUser(It.IsAny<string>(), It.IsAny<string>())
).Returns<string, string>((u, p) => 
    (u == username && p == password) ?
    new ValidUserContext { 
        Principal = principal
    }
    : new ValidUserContext()
);
43
задан Boann 24 July 2019 в 16:12
поделиться