Я хотел бы установить метод с 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()
);