В общем, я бы рекомендовал не проверять вещи на работающей базе данных по нескольким причинам:
- Выполнение SQL может сделать ваши тесты длительными
- Данные могут измениться у вас под носом, что приведет к сбою тестов даже без видимых изменений кода. Вы хотите, чтобы ваши тесты были изолированными и детерминированными, поэтому они проходят или не проходят только при изменении кода.
- Если у вас есть код, который обновляет базу данных, вам нужно откатить свои изменения, иначе следующий запуск теста может привести к ложному положительному или ложному отрицательному значению.
Итак, для тестирования вы хотите подделать вашу базу данных. Начните с чего-то вроде этого:
public interface IDataRepository {
Customer GetCustomerByName(string name);
void SaveCustomer(Customer c);
SecurityToken Login(string username, string password);
}
class DatabaseRepository : IDataRepository { ... } // invokes your stored procedures
Если вашим классам нужно что-то из базы данных, передайте IDataRepository
в конструктор вашего объекта.
Приятной особенностью этой настройки является то, что вы можете создать FakeDataRepository
, реализующий тот же интерфейс - он ничего не вызывает, а только возвращает жестко закодированные данные. Вы можете вернуть данные для счастливого случая, для случая исключения и других потребностей.
Другими словами, вы вообще не тестируете взаимодействие между вашими классами и базой данных. Цель модульного теста - проверить один функциональный элемент, не заботясь о других движущихся частях вашего приложения.
Теперь, если вам нужно для проверки ваших хранимых процедур, вы должны написать тесты для вашего DatabaseRepository
класса напрямую.
Вам необходимо после каждой проверки переустанавливать свою базу данных в исходное состояние, чтобы вы либо запускали все в транзакции и откате, либо создавали новую базу данных с чистыми данными при каждом запуске теста. Я предпочитаю последний подход - слишком просто оставить транзакцию открытой или забыть откатить ее и, следовательно, уничтожить все ваши тестовые данные.
Подобные тесты базы данных могут выполняться произвольно долго, поэтому вам, вероятно, лучше всего создать отдельный проект исключительно для тестирования вашей базы данных (особенно если у вас есть несколько сотен хранимых процедур).
Я бы подумал, что это скорее системный или интеграционный тест, а не модульный тест.