ObjectContext никогда не происходит от интерфейса ?? Как вы применяете DI / IoC в случае нескольких типов ObjectContext? - PullRequest
2 голосов
/ 14 января 2010

Если у вас есть система, которая имеет несколько типов контекстов объекта. Например, BillingObjectContext, HumanResourceObjectContext и т. Д. Все они являются производными от ObjectContext, но класс ObjectContext не реализует какой-либо конкретный интерфейс, например IObjectContext. Как бы вы применили DI / IoC в случае, если несколько типов ObjectContext скажут, используя Ninject?

Ответы [ 2 ]

6 голосов
/ 14 января 2010

Если вы должны зависеть от этого в тесте, вы должны высмеять его. Вот образец ; это не намного сложнее, чем реализовать интерфейс. Смотрите также улучшения TDD в EF 4 .

0 голосов
/ 07 сентября 2013

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

Я знаю, что большинство ответов на этот вопрос предлагают использовать схемы 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. 
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...