Вы смотрите на интеграционные тестах, а не юнит-тесты. Тесты интеграции имеют зависимость от внешней системы (datetime, database, filesystem, networkervice и т. Д.), Тогда как модульные тесты их объема ограничиваются одной единицей (один или несколько методов в одном или нескольких классах).
Первое, что нужно понять, это то, что для проведения теста интеграции вы будете полагаться на внешнюю систему. Вы никогда не хотите протестировать свою производственную среду, и вы хотите сохранить контроль над тестовыми данными.
По этой причине вы должны создать базу данных, которая точно такая же, как и существующая, но лишена всех данных и вместо этого использует макет данных. Это гарантирует, что ваши тесты будут оставаться неизменными во всех изменениях и, следовательно, на них можно положиться.
Вы также должны помнить, что ваша тестовая база данных функционально эквивалентна вашей базе данных, чтобы не отставать от нее и иметь устаревшие тесты.
Что здесь общего в этом: абстрактный уровень источника данных. Если вы поместите все вызовы базы данных за интерфейс, вы можете просто обмануть/заглушить этот интерфейс и предоставить тестовые данные оттуда.
Ваша единица работы должна быть до такой степени и проверять одну вещь, которую должен выполнять метод (принцип единой ответственности).
Если целью вашего метода является манипулирование данными из базы данных, то вы издеваетесь над вашим источником данных, и ваш блок проверяет ваши манипуляции.
Если целью вашего метода является вызов хранимой процедуры в вашей базе данных, то вы используете свой интеграционный тест для подачи ввода процедуры и утверждения против его вывода.
Простой пример этого принципа в действии: (! Смотреть в концепции инъекции зависимостей и контейнеров IoC)
interface DataSource {
List<String> GetData();
}
class Manipulator {
private DataSource _source;
public Manipulator(){ }
public Manipulator(DataSource d) { _source = d; }
pubic void ManipulateData(){
var data = _source.GetData();
// Do something with the data
}
}
В этом примере используется конструктор инъекции. не
Теперь, чтобы ответить на ваши вопросы по существу:
Если я должен назвать эти методы из моего модульного тестирования, я на самом деле делаю п нет базы данных вызовов ... стоят ли?
Да, в противном случае у вас нет интеграционного теста. Поскольку у вас есть отдельная тестовая база данных, это не будет мешать вашей производственной среде.
Если мне нужно использовать данные макета, как получить копию данных из базы данных локально?
Я не совсем уверен, что вы просите здесь, чтобы быть честным, но я думаю, что это разрешено с идеей тестовой базы данных.
Как имитировать вызовы хранимой процедуры для использования данных макета?
У вас нет. Вы используете фактические хранимые процедуры, вызывая их с вашими тестовыми данными и утверждая результат о том, что вы ожидаете. Если они работают, то это конец, если они не вернут правильный результат, тогда вы знаете, что что-то пошло не так.
Какая часть вызова хранимых процедур вы хотите протестировать? Вы пишете свои собственные классы SQL? (Для обычного приложения вы просто издеваетесь над уровнем персистентности данных и никогда не будете беспокоиться о вызовах БД в модульных тестах ...) –
Чтобы проверить правильность поля, он создает пару вызовов db и на основе возвращаемых данных делает пару проверок на этих полей и возвращает true или false. С учетом сценария, как вы будете издеваться? и что вы подразумеваете под насмешливым уровнем сохранения данных? Pls eloborate. Большое спасибо за ваш ответ! – user3123734
Jeroen Vannevel имеет очень подробный ответ (+1). Это действительно не похоже на то, что вам нужны * единичные тесты * для этого случая. –