Я в основном пытаюсь научить себя тому, как кодировать, и я хочу следовать хорошей практике. Очевидные преимущества для модульного тестирования. Существует также много фанатизма, когда дело доходит до модульного тестирования, и я предпочитаю гораздо более прагматичный подход к кодированию и жизни в целом. В качестве контекста я в настоящее время пишу свое первое "реальное" приложение, которое является вездесущим движком блога с помощью 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");
}