Предисловие: я не знаком с использованием Moq (здесь пользователь Rhino Mocks), поэтому я могу пропустить несколько трюков.
Я изо всех сил пытаюсь следовать некоторому коду здесь; как отметил Марк Симанн, я не понимаю, почему это могло бы скомпилироваться в его текущем состоянии. Можете ли вы дважды проверить код, пожалуйста?
Одна вещь, которая бросается в глаза, это то, что вы вводите макет IDBFactory в менеджер статей. Затем вы делаете цепной вызов:
_article = _dbFactory.GetArticleDAO().GetByTitle(title)
Вы не предоставили реализацию GetArticleDAO
. Вы только высмеяли бит LoadByTitle
, который происходит после вызова GetARticleDAO
. Комбинация ложных и цепных вызовов в тесте обычно является признаком того, что тест может стать болезненным.
Закон Деметры
Важный момент здесь: Уважайте Закон Деметры . ArticleManager использует IArticleDAO, возвращенный IDBFactory. Если IDBFactory не делает что-то действительно важное, вы должны внедрить IArticleDAO в ArticleManager.
Миско красноречиво объясняет, почему копаться в соавторах - плохая идея. Это означает, что у вас есть дополнительный привередливый шаг в настройке, а также делает API более запутанным.
Кроме того, почему вы храните возвращенную статью в ArticleManager как поле? Не могли бы вы просто вернуть его?
Если эти изменения будут возможны, это упростит код и упростит тестирование в 10 раз.
Ваш код станет:
public class ArticleManager : IArticleManager
{
private IArticleDAO _articleDAO
public ArticleManger(IArticleDAO articleDAO)
{
_articleDAO = articleDAO;
}
public IArticle LoadArticle(string title)
{
return _articleDAO.GetByTitle(title);
}
}
Тогда у вас будет более простой API, и его будет намного проще тестировать, поскольку вложение прошло.
Упрощение тестирования при использовании постоянства
В ситуациях, когда я выполняю модульное тестирование кода, взаимодействующего с механизмами персистентности, я обычно использую шаблон репозитория и создаю раскрученные вручную фальшивые репозитории в памяти, чтобы помочь с тестированием. Их, как правило, тоже просто написать - это просто обертка вокруг словаря, которая реализует интерфейс IArticleRepository.
Использование этого вида техники позволяет вашему ArticleManager использовать механизм поддельной персистентности, который ведет себя очень похоже на БД для целей тестирования. Затем вы можете легко заполнить репозиторий данными, которые помогут вам безболезненно протестировать ArticleManager.
Среды Mocking - действительно хорошие инструменты, но они не всегда подходят для установки и проверки сложных или согласованных взаимодействий; если вам нужно смоделировать / заглушить несколько вещей (особенно вложенных!) в одном тесте, это часто является признаком того, что тест переоценен или что лучше сделать сданный вручную двойной тест.
Тестирование сложное
... и, на мой взгляд, вдвойне сложно, если начать с насмешливых фреймворков. Я видел, как многие люди связывают себя узлами с насмешливыми рамками из-за «магии», которая происходит под капотом. В результате я, как правило, рекомендую держаться от них подальше , пока вы не освоитесь с свернутыми вручную заглушками / издевательствами / подделками / шпионами и т. Д. .