Почему мы не можем просто создать фактический объект контекста для использования в наших тестах? Поскольку мы не хотим, чтобы наши тесты влияли на производственную базу данных, мы всегда можем указать строку подключения, которая указывает на тестовую базу данных. Перед выполнением каждого теста создайте новый контекст, добавьте данные, которые вам понадобятся в тесте, приступите к модульному тесту, затем в разделе очистки теста удалите все записи, созданные во время теста. Единственным побочным эффектом здесь будет то, что идентификаторы автоинкремента будут использоваться в тестовой базе данных, но так как это тестовая база данных - кого это волнует?
Я знаю, что большинство ответов на этот вопрос предлагают использовать схемы DI / IoC для создания интерфейсов для контекстов данных и т. Д., Но причина, по которой я использую Entity Framework, заключается именно в том, чтобы не писать какие-либо интерфейсы для соединений с базой данных, объектных моделей и простых CRUD транзакции. Чтобы создавать фиктивные интерфейсы для моих объектов данных и писать сложные запрашиваемые объекты для поддержки LINQ, мы отказываемся от цели полагаться на проверенные и надежные Entity Framework .
Этот шаблон для модульного тестирования не нов - Ruby on Rails давно использует его, и он отлично работает. Так же, как .NET предоставляет EF, RoR предоставляет ActiveRecord объекты, и каждый модульный тест создает необходимые ему объекты, продолжает тесты, а затем удаляет все созданные записи.
Как указать строку подключения для тестовой среды? Поскольку все тесты находятся в их собственном специализированном тестовом проекте, достаточно добавить новый файл App.Config
со строкой соединения для тестовой базы данных.
Только подумайте, сколько головной боли и боли это спасет вас.
namespace ProjectNamespace
{
[TestClass]
public class UnitTest1
{
private ObjectContext objContext;
[TestInitialize]
public void SetUp()
{
// Create the object context and add all the necessary data records.
}
[TestMethod]
public void TestMethod1()
{
// Runs the tests.
}
[TestCleanup]
public void CleanUp()
{
// Delete created records.
}
}
}