Как вы протекаете класс, который предназначен для общения с данными?

StackOverflow https://stackoverflow.com/questions/2753232

Вопрос

У меня есть несколько классов репозитория, которые предназначены для общения с различными видами данных, вытекающие из IRepository интерфейс.

В реализациях код общается с источником данных, будь то каталог файлов XML или базы данных или даже просто кэш. Можно ли надежно проверить любую из этих реализаций? Я не вижу макетной реализации, потому что тогда я тестирую только макет, а не фактический код.

Это было полезно?

Решение

Нет, вы бы использовали макет, когда писали класс, который Использование атмосфера IRepository. Анкет Для реализации из IRepository, Вам нужно проверить по соответствующему источнику данных. Для баз данных это немного боли - для файловой системы, немного меньше.

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

Независимо от того, вызовуте ли вы такие тесты «модуль» или нет, это вопрос того, как вы определяете модульные тесты; Лично меня не слишком заботится об задействованных именах, но я делать заботиться о проведении тестов. В частности, для баз данных, они могут быть несколько болезненными (особенно если вы хотите иметь возможность запускать тесты параллельно) - но, по моему опыту, они также могут быть невероятно ценными.

Другие советы

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

Это интеграционные тесты, а не модульные тесты.

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

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

Если в вашем репозитории есть другие обязанности (например, реализация единицы рабочей схемы), то вы можете захотеть проверить их отдельно.

В какой -то момент в реализации IrePository вы будете использовать API третьей стороны, которая фактически будет читать/записать в/из базы данных/файл/XML. Что вы хотите сделать, так это издеваться над этими API, чтобы убедиться, что ваш код вызывает правильный API в правильном порядке.

Поэтому, если вы читаете из базы данных, вы можете издеваться над SQLConnection и SQLCommand и убедитесь, что вы называете правильные методы на этих классах. Если вы пишете в поток, вы можете издеваться над потоком и убедиться, что вы его промыли и утилизируете его (например).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top