Я в основном пытаюсь научиться программировать и хочу следовать передовым методам. Есть очевидные преимущества модульного тестирования. Когда дело доходит до модульного тестирования, также проявляется много фанатизма, и я предпочитаю гораздо более прагматичный подход к кодированию и жизни в целом. Что касается контекста, в настоящее время я пишу свое первое «настоящее» приложение, которое является повсеместным движком блогов, использующим asp.net MVC. Я вольно слежу за архитектурой MVC Storefront с моими собственными корректировками. Таким образом, это мой первый настоящий набег на издевательства над объектами. Я поставлю пример кода в конце вопроса.
Я был бы признателен за любую информацию или сторонние ресурсы, которые я мог бы использовать, чтобы улучшить свое понимание основ тестирования и насмешек. Ресурсы, которые я нашел в сети, обычно ориентированы на то, как насмехаться, и мне нужно больше понимания того, где, почему и когда издеваться. Если это не лучшее место, чтобы задать этот вопрос, пожалуйста, укажите мне место получше.
Я пытаюсь понять ценность следующих тестов. UserService зависит от IUserRepository. Ценность уровня обслуживания состоит в том, чтобы отделить вашу логику от вашего хранилища данных, но в этом случае большинство вызовов UserService просто передаются прямо в IUserRepository. Тот факт, что реальной логики для тестирования не так много, тоже может быть источником моих опасений. У меня есть следующие опасения.
- Такое ощущение, что код просто проверяет, работает ли фреймворк для фиксации.
- Чтобы смоделировать зависимости, в моих тестах слишком много знаний о реализации IUserRepository. Это необходимое зло?
- Какую ценность я получаю от этих тестов? Заставляет ли меня сомневаться в ценности этих тестов простота тестируемой услуги.
Я использую NUnit и Rhino.Mocks, но должно быть довольно очевидно, чего я пытаюсь достичь.
[SetUp]
public void Setup()
{
userRepo = MockRepository.GenerateMock<IUserRepository>();
userSvc = new UserService(userRepo);
theUser = new User
{
ID = null,
UserName = "http://joe.myopenid.com",
EmailAddress = "[email protected]",
DisplayName = "Joe Blow",
Website = "http://joeblow.com"
};
}
[Test]
public void UserService_can_create_a_new_user()
{
// Arrange
userRepo.Expect(repo => repo.CreateUser(theUser)).Return(true);
// Act
bool result = userSvc.CreateUser(theUser);
// Assert
userRepo.VerifyAllExpectations();
Assert.That(result, Is.True,
"UserService.CreateUser(user) failed when it should have succeeded");
}
[Test]
public void UserService_can_not_create_an_existing_user()
{
// Arrange
userRepo.Stub(repo => repo.IsExistingUser(theUser)).Return(true);
userRepo.Expect(repo => repo.CreateUser(theUser)).Return(false);
// Act
bool result = userSvc.CreateUser(theUser);
// Assert
userRepo.VerifyAllExpectations();
Assert.That(result, Is.False,
"UserService.CreateUser() allowed multiple copies of same user to be created");
}