Как проверить мой бизнес уровень? - PullRequest
1 голос
/ 22 ноября 2010

Я использовал Moq и первоначально Rhino Mocks за последний год вместе с TDD. Мне действительно нравилось развиваться таким образом, однако я пришел к тому, что в моем проекте я чувствую, что, возможно, это не то, что мне нужно делать.

Я проверил и выгнал свой дизайн, и все работает отлично. Теперь у меня есть слой над моими объектами, где мне нужно проверить. Поскольку у меня есть несколько объектов (использующих Inversion of Control через интерфейсы), заглушка и насмешка над всеми этими сервисами кажутся такой большой работой. В одном тесте мне нужно остановить как минимум 8 сервисов, прежде чем я смогу протестировать свой код. Похоже, что написание большого количества кода не приносит никакой реальной выгоды и является настолько трудоемким.

Мой вопрос: "Есть ли лучший способ сделать это"? Для этого лучше подойдет поведенческий дизайн или какая-то другая методология, так как я на самом деле не занимаюсь модульным тестированием?

Ответы [ 3 ]

3 голосов
/ 22 ноября 2010

Только в редких случаях у вас будет класс в зависимости от 8 других классов.

По моему опыту, только ModelView в MVVM может иметь такую ​​огромную зависимость. Если в вашей бизнес-логике у вас есть класс, зависящий от более чем 4 других сервисов, я считаю, что вам нужно рефакторинг вашего кода.

Идея - это принцип одиночной ответственности , у вас будет больше классов, но меньше кода.

1 голос
/ 22 ноября 2010

BDD на уровне единицы больше о мышлении и словарном запасе, чем что-либо еще. Если я думаю о вашем классе, не используя слово «тест», просто концентрируясь на его обязанностях и поведении, это помогает мне понять, что может быть не так. Я думаю, что если вашему классу нужно 8 услуг, чтобы выполнить свою работу, возможно, у него слишком много обязанностей. Не могли бы вы делегировать некоторые из этих обязанностей другому классу, а затем высмеять это?

BDD на уровне сценария действительно предназначен для того, чтобы помочь вам подумать о поведении, масштабах и обязанностях целых систем и обсудить их. Я не думаю, что это поможет вам решить дизайн класса, о котором вы говорите. Тем не менее, с моей шляпой BDD я могу сказать вам, что BDD не о тестировании. Речь идет об обнаружении невежества, решении его, а затем передаче этих знаний, чтобы сделать код простым и безопасным для изменения.

Поэтому я советую делать все, что делает код простым и безопасным для изменения. Если вы пишете хрупкие тесты, которые будут ломаться в первый раз, когда кто-то что-то меняет, тогда, да, возможно, вместо этого поднимите его на уровень (к сценариям и поведению системы). В противном случае напишите несколько хороших примеров на уровне модулей и реорганизуйте код, как подсказывает @Aliostad.

1 голос
/ 22 ноября 2010

Если вам нужно 8 услуг, то вам понадобится 8 заглушек. Я не думаю, что вы можете избежать этого.

Если вы хотите меньше кодировать, вы можете также реорганизовать свой юнит-тест и создать иерархию или какой-либо другой подходящий OO-продукт для группировки кода установки всех 8 сервисов.

EDIT

В противном случае вы можете создать «мегаобъект». Предположим, что 8 сервисов реализуют каждый свой интерфейс: IService1 , IService2 и так далее. В модульном тесте вы можете создать интерфейс, который группирует интерфейс каждого сервиса:

interface ISuperInterface: IService1, IService2, ... { }

Тогда вам просто нужно высмеять один объект.

...