TDD и ADO.NET Entity Framework

В последнее время я играл с ADO.NET Entity Framework и считаю, что это соответствует моим потребностям для проекта, который я разрабатываю. Мне также нравится его неинвазивный характер.

После создания модели данных из существующей базы данных перед вами стоит задача интеграции созданной модели и вашей бизнес-логики. В частности, я привык к интеграционному тестированию моих классов, которые взаимодействуют с хранилищем данных через макеты / заглушки интерфейсов DAL. Проблема в том, что вы не можете сделать это с помощью ADO.NET Entity Framework, потому что объекты, которые он генерирует, являются простыми классами без интерфейса.

Возникает вопрос: как применить подход TDD к разработке приложения, использующего ADO.NET Entity Framework? Возможно ли это вообще, или мне следует перейти на другой набор инструментов для создания DAL?


person Dario Solera    schedule 25.11.2008    source источник
comment
Нет, ответ больше не действителен. Ознакомьтесь с stackoverflow.com/a/23598884/3481183   -  person Believe2014    schedule 12.05.2014


Ответы (6)


Одна из самых серьезных критических замечаний в адрес Entity Framework заключалась в том, что ее сложно протестировать, например, в ALT.Net вотум недоверия, процитированный gef.

Вот сообщение в блоге, в котором обсуждается, как обойти это и иметь возможность тестировать свой код, не обращаясь к базе данных, при использовании Entity Framework.

Если возможность тестирования вызывает большую озабоченность, вы можете взглянуть на другую структуру ORM, такую ​​как NHibernate, по крайней мере, до тех пор, пока не будет выпущена Entity Framework 2.0.

person Erik Öjebo    schedule 25.11.2008
comment
Отличная ссылка на это сообщение в блоге, хотя кажется, что предстоит много работы, чтобы решить проблему, которая не будет существовать после EF 2.0 ... - person Dave Swersky; 10.08.2009
comment
Я отклонил этот ответ, потому что теперь можно создавать модульные тесты для EF. EF сильно изменился. См. stackoverflow.com/a/23598884/3481183 - person Believe2014; 12.05.2014

Хотя на исходный вопрос был дан ответ, я чувствую, что могу кое-что добавить:

В настоящее время я использую Entity Framework 4.0 на сайте интрасети, который я создаю. Я могу протестировать все в моей бизнес-логике и контроллерах без подключения к базе данных, используя добавленную поддержку POCO.

Хотя POCO могут быть сгенерированы из нового шаблона t4, включенного в VS 2010, кое-что, что мне не удалось найти в VS 2010, - это шаблон t4 для генерации контекста вашего объекта (контекст объекта в основном работает как встроенный модуль работы для EF и необходим для сопоставления ваших EF-объектов с POCO). К счастью, Иоахим Ликке Андерсен в своем сообщении в блоге Entity Framework 4.0 Beta 1 - POCO, ObjectSet, Repository и UnitOfWork написали шаблон t4 для его создания, и это было очень полезно. Если вы ищете решение с использованием EF4, которое можно тестировать без подключения к базе данных, я настоятельно рекомендую реализовать что-то похожее на его решение, которое включает в себя общий репозиторий, оболочку единиц работы и фабрику единиц работы. Это было очень полезно.

Удачи.

person Matt Wear    schedule 01.03.2010
comment
Ссылка выше не работает. Любое другое справочное место, где можно найти шаблон t4? Если да, пожалуйста, передайте его. - person manu; 26.07.2012
comment
Я обновил сообщение, чтобы указать на автора блога Иоахима Ликке Андерсена и изменить ссылку на архив Wayback Machine от 30 октября 2010 г. - person Rich Shealer; 24.12.2012

Я согласен с тем, что версия 1 Entity Framework является преступлением против дизайна и определенно получила мой вотум недоверия. Я благодарен команде разработчиков EF за то, что они признали провал и открыли процесс разработки для сообщества. Следующий выпуск не будет идеальным, он может быть даже не готов для использования в приложении производственного уровня, но я думаю, что они наконец начинают понимать, что важно для тех, кто использует, кто знает, что плохой дизайн - плохой бизнес. При этом ... Я все еще подозреваю. Постоянная обратная связь во время разработки - новость для этих ребят, и я прочитал довольно много заявлений в блоге ADO.NET, которые поднимают яркие красные флажки. Посмотрим, как это пойдет с выпуском .NET 4.0.

Хотя они, похоже, пытаются:

Пошаговое руководство по разработке через тестирование с помощью Entity Framework 4.0

person Jason Stonebraker    schedule 26.01.2010

«Тесная связь инфраструктуры сохраняемости с классами сущностей в значительной степени исключает возможность эффективного использования очень жестких циклов обратной связи в бизнес-логике с автоматическим тестированием. В текущем состоянии классы сущностей EF не могут эффективно тестироваться отдельно от базы данных.

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

Способность команды выполнять эволюционное проектирование и поэтапную поставку подрывается из-за невнимания Entity Framework к фундаментальным принципам проектирования программного обеспечения, таким как разделение проблем ".

Явно украдено отсюда: http://efvote.wufoo.com/forms/ado-net-entity-framework-vote-of-no-confidence/

person gef    schedule 25.11.2008

Если вы смотрите конкретно на инструменты генерации DAL, вам будет сложно интегрировать их с TDD. Большинство известных мне инструментов генерации dal также генерируют ваши бизнес-объекты и тесно связывают их с DAL, что затрудняет тестирование.

Вы можете взглянуть на инструменты OR-отображения, такие как nHibernate и, возможно, Linq to sql, которые включают «постоянное игнорирование», вы можете сами определять свои бизнес-объекты, и они не имеют ссылок на DAL или любой другой код инфраструктуры. Это значительно упрощает тестирование бизнес-логики отдельно от базы данных. Я обнаружил, что он также намного лучше позволяет использовать другие сценарии, такие как периодически подключаемые клиенты.

person Mendelt    schedule 25.11.2008

Этот ответ изменился на «Да, можно».

Вы можете создавать POCO и интерфейсы, используя настраиваемые шаблоны T4, такие как https://entityinterfacegenerator.codeplex.com/, затем создавать имитирующие объекты для тестирования EF, не затрагивая базу данных.

person Believe2014    schedule 11.05.2014