У меня есть класс, который имеет дело с материалом Account. Он предоставляет методы для входа в систему, сброса пароля и создания новых учетных записей.TDD - Я делаю это правильно?
Я ввожу зависимости через конструктор. У меня есть тесты, которые проверяют ссылку каждой зависимой ссылки, если ссылка является нулевой, она вызывает исключение ArgumentNullException.
Класс Account предоставляет каждую из этих зависимостей через свойства только для чтения. Затем у меня есть тесты, которые проверяют, является ли ссылка, переданная конструктором, такой же, как свойство возвращает. Я делаю это, чтобы убедиться, что ссылки хранятся в классе. (Я не знаю, является ли это хорошей практикой тоже.)
Первый вопрос: Является ли это хорошей практикой в TDD? Я спрашиваю об этом, потому что этот класс имеет 6 зависимостей до сих пор, и он становится очень повторяющимся, а также тесты становятся довольно длинными, поскольку я должен издеваться над всеми зависимостями для каждого теста. То, что я делаю, это просто копировать и вставлять каждый раз и просто изменять проверяемую ссылку зависимостей.
Второй вопрос: мой способ создания учетной записи выполняет такие действия, как проверка пройденной модели, вставка данных в 3 разные таблицы или четвертую таблицу, если присутствует определенный набор значений и отправка электронной почты. Что я должен здесь проверить? Я до сих пор тестировал, проверяет, будет ли выполняться проверка модели, если метод Add для каждого репозитория будет вызван, и в этом случае я использую метод обратного вызова Moq для изделенного репозитория для сравнения каждого добавляемого свойства в репозиторий против те, которые я прошел по модели.
Что-то вроде:
userRepository
.Setup(r => r.Add(It.IsAny<User>()))
.Callback<User>(u =>
{
Assert.AreEqual(model.Email, u.Email);
Assert.IsNotNull(u.PasswordHash);
//...
})
.Verifiable();
Как я уже сказал, эти тесты становятся длиннее, я думаю, что это не больно, чтобы проверить, что я могу, но я не знаю, стоит ли это его, как это это займет время, чтобы написать тесты.
«Это хорошая TDD?» это действительно неправильный вопрос; более полезный вопрос: «Это работает для меня и моего проекта?» Методологии, подобные TDD, несмотря на то, что фанатики хотели бы, чтобы вы думали, означает конец, а не конец сами по себе. – Casey
-1 Это не вопрос TDD, это вопрос дизайна модульного тестирования. – gurun
Вот мои 2 цента. Я не буду раскрывать ваши зависимости как свойства. Я видел такие вещи, которые злоупотребляли разработчики. в прошлом, когда они используют зависимость, которая подвергает зависимость в своих классах (совсем не совсем).Если вам становится сложно собирать свой класс SUT, вы можете использовать фабричный метод для создания класса SUT или лучше использовать шаблон тестового построителя. – Andrew