Еще один замечательный ресурс - книга Джерарда Месароса "Тестовые шаблоны xUnit: рефакторинг тестового кода"
сновном пытаюсь научиться кодировать, и я хочу следовать хорошей практике. Есть очевидные преимущества для модульного тестирования. Когда речь заходит о юнит-тестировании, здесь также много фанатизма, и я предпочитаю гораздо более прагматичный подход к кодированию и жизни в целом. В настоящее время я пишу свое первое «настоящее» приложение, которое представляет собой вездесущий движок блогов, использующий 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");
}