Похоже, вы на правильном пути, но позвольте мне попытаться объяснить, как я буду проходить тест.
Фактическая тестируемая система (SUT) - это класс Authenticate
. Вы не много рассказали об этом, поэтому я приму следующее:
Он использует экземпляр ICustomerRepository
для определения существования пользователя на основе комбинации имени пользователя (электронной почты) и пароля.
Когда хранилище возвращает экземпляр Customer
, учитывая комбинацию имени пользователя и пароля, метод Login
возвращает true. Когда хранилище возвращает null
, метод Login
возвращает false.
Я буду использовать эти допущения в следующем, но если они не верны, я уверен, что вы сможете изменить тесты, чтобы они соответствовали вашему сценарию.
Тест 1: Если комбинация имени пользователя и пароля верна, Login
вернет true
public void LoginWillReturnTrueForAValidUsernamePasswordCombination()
{
string email = "test@test.com";
string password = "test";
//Dummy customer
var customer = new Customer();
//Create mock
var mockRepos = new Moq.Mock<ICustomerRepository>();
mockRepos.Setup(x => x.GetCustomerByPasswordUsername(
It.Is<string>(s => s == email),
It.Is<string>(s => s == password))
.Returns(customer);
var auth = new Authenticate(mockRepos.Object);
//Act
var result = auth.Login(email, password);
//Assert
Assert.IsTrue(result);
}
Обратите внимание на использование It.Is
. По сути, макет настроен таким образом, что он будет возвращать фиктивный объект-клиент только тогда, когда электронная почта и пароль, определенные в вашем тесте, будут переданы методу GetCustomerByPasswordUsername
.
Тест 2: Если комбинация имени пользователя и пароля неверна, Login
вернет false
public void LoginWillReturnFalseForAnInvalidUsernamePasswordCombination()
{
string email = "test@test.com";
string password = "test";
//Create mock
var mockRepos = new Moq.Mock<ICustomerRepository>();
mockRepos.Setup(x => x.GetCustomerByPasswordUsername(
It.Is<string>(s => s == email),
It.Is<string>(s => s == password))
.Returns<Customer>(null);
var auth = new Authenticate(mockRepos.Object);
//Act
var result = auth.Login(email, password);
//Assert
Assert.IsFalse(result);
}
Несмотря на то, что тесты, описанные выше, неявно тестируются, вы можете пойти дальше и написать тест, который гарантирует, что метод Login
передает правильные параметры в хранилище. Такой тест может выглядеть следующим образом:
Тест 3: при входе в систему будет правильно запускаться хранилище
public void LoginWillInvokeGetCustomerByPasswordUsernameCorrectly()
{
string email = "test@test.com";
string password = "test";
//Create mock
var mockRepos = new Moq.Mock<ICustomerRepository>();
mockRepos.Setup(x => x.GetCustomerByPasswordUsername(
It.Is<string>(s => s == email),
It.Is<string>(s => s == password))
.Returns<Customer>(null)
.Verifiable();
var auth = new Authenticate(mockRepos.Object);
//Act (ignore result. We are only testing correct invocation)
auth.Login(email, password);
//Assert
mockRepos.Verify();
}
Метод макета Verify
создает исключение, если не были вызваны настроенные методы.
Надеюсь, это поможет. Не стесняйтесь спрашивать, если у вас есть дополнительные вопросы.