Насмешливый ObjectContext, имеющий дело с методом ObjectQuery.Include (string)? - PullRequest
2 голосов
/ 04 июня 2010

Я изучал, как отделить мои DomainServices от их источника данных, чтобы я мог проверить их в модульных тестах. Я начинаю думать, что полностью отделить их невозможно.

Существует довольно много информации, такой как вопрос и сообщение в блоге . В частности, публикация в блоге поможет вам глубоко проникнуть в ObjectContext.

Но у моих DomainServices есть такие методы:

public IQueryable<Client> GetClients()
{
    return ObjectContext.Clients
        .Include("Foo")
        .Include("Bar")
        .Where(c => c.IsBaz);
}

Кажется невозможным полностью смоделировать метод Include, поскольку он возвращает ObjectQuery<T>, а метод Include нигде не захвачен в интерфейсе (интерфейса IObjectQuery нет). ObjectQuery реализует IQueryable<T>, и поэтому я подумал, что мой собственный метод Include, который возвращает IQueryable, будет работать, но только если я планирую вызывать Include не чаще одного раза для запроса.

Я использую EF4, .NET 4, Silverlight 4 и RIA Services RTW.

Как пустяк, я разочарован тем, как тестировать недружественный LINQ to Entities и, соответственно, RIA Services: (

1 Ответ

1 голос
/ 04 июня 2010

Не думаю, что вы должны проходить юнит-тестирование на этом уровне. Я готов к юнит-тестам, но есть определенный момент, когда вам нужно остановиться.

Допустим, что код является частью ClientsLinqRepository, который, в свою очередь, реализует IClientsLinqRepository. Вы издеваетесь над IClientsLinqRepository, когда реализуете код, который от него зависит.

Несмотря на то, что вышеизложенное совершенно верно, ClientsLinqRepository является интеграционной реализацией. Почти так же, как если бы у вас был IMessageSender и вы реализовали MailSender. Здесь у вас есть код, основной задачей которого является интеграция с отдельной системой, для вас это база данных.

Исходя из вышеизложенного, я предлагаю вам провести целевые интеграционные тесты для этого класса. Таким образом, в этом случае вы хотите подключиться к внешней системе (базе данных) и убедиться, что код интеграции правильно работает с внешней системой. Это позволит вам быстро определить, не нарушено ли что-либо в коде по сравнению с базой данных, не имея дело со сложностью остальной системы (что является проблемой при попытке выполнить интеграционные тесты на других уровнях).

Держите сфокусированные интеграционные тесты отдельно от модульных тестов, чтобы вы могли запускать удивительно быстрые модульные тесты столько раз, сколько вы хотите, и запускать интеграционные тесты, когда вносятся изменения в любой из компонентов интеграции, время от времени

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...