Вероятно, это не то, что вы хотите услышать, но вы не хотите насмехаться над DbContext
. Я знаю, что это делалось все время, и в EF6 это даже стало проще, чем раньше. Для реализации фиктивных объектов доступно еще больше интерфейсов и виртуальных методов. Технически это не сложно.
Важно поведение.
Даже в вашем небольшом примере есть возможный подвох. Макет DbSet
будет выполнять сортировку с учетом регистра. Подключенный DbSet
будет получать отсортированные данные из базы данных, и многие параметры сортировки базы данных не учитывают регистр. Таким образом, модульный тест может дать результаты, отличные от интеграционного теста, даже в этом, казалось бы, незначительном случае.
Различия между in-memory и подключенным LINQ огромны. Лично я провожу интеграционные тесты только для всего, что связано с любым запросом LINQ to Entities. Слишком просто создать фиктивный граф объектов, который выглядел бы иначе, если бы его построил EF. В своих сервисных методах я иногда составляю довольно сложные запросы, возможно, с использованием Includes
, возможно, намеренно пропуская null
охранников, зная, что инструкция транслируется в SQL, возможно, с некоторой ленивой загрузкой или полагаясь на исправление отношений. Я должен знать о состояниях сущностей, продолжительности жизни контекста, проверке, которая срабатывает при сохранении изменений, параллелизме ... Я просто не верю зеленым тестам, когда все это издевается.
Конечно, осталось достаточно бизнес-логики для тестирования с помощью чистого модульного теста. Как только вы можете сделать предположение, что правильные объекты доступны (потому что вы тестируете это отдельно в интеграционных тестах), вы можете смоделировать их и выполнить модульное тестирование их поведения в памяти.
person
Gert Arnold
schedule
05.04.2014