Где создать экземпляр контекста данных (адаптер, соединение, сеанс и т. Д.) В MVC? - PullRequest
2 голосов
/ 10 августа 2009

Мы создаем сайт ASP.NET MVC, и я пытаюсь определить, где определить соединение, чтобы лучше включить модульное тестирование (я использую «соединение» в общем - это может быть сеанс, соединение, адаптер или любой другой тип контекста данных, который может управлять транзакциями и операциями с базой данных).

Допустим, у нас есть 3 класса:

UserController
UserService
UserRepository

В прошлом мы делали что-то подобное в методе UserService:

Using (ISomeSession session = new SomeSession())
{
  session.StartTransaction();
  IUserRepository rep = new UserRepository(session);
  rep.DoSomething();
  rep.Save();
  session.Commit();
}

Однако на самом деле не было возможности провести модульное тестирование, так как зависимость от SomeSession не была введена. Однако, если мы используем Д.И. чтобы внедрить зависимость в UserService, сеанс висит на протяжении всей жизни UserService. Если есть несколько сервисов, вызываемых из UserController, у каждого из них могут быть сессии, просто зависающие до тех пор, пока UserController не будет собирать мусор.

Есть мысли о том, как лучше справиться с этим? Я что-то упускаю из виду?

Редактировать

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

Ответы [ 2 ]

2 голосов
/ 10 августа 2009

Как правильно заметил RichardOD, вы не можете использовать живые соединения с базой данных для написания модульных тестов. Если вы делаете это, то вы проводите интеграционное тестирование.

У меня есть отдельные реализации для моего интерфейса репозитория, один реальный репозиторий и один фальшивый репозиторий для модульного тестирования. Поддельный репозиторий работает с общим списком, а не с реальным контекстом данных. Я использую DI (с Ninject, чтобы сделать вещи более удобными, но вы можете сделать это так же хорошо вручную), чтобы ввести правильный репозиторий.

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

Редактировать: После добавления комментария, я думаю, теперь я понимаю, о чем вы на самом деле просили. Забавно, что вы спросите что-нибудь об этом, так как на прошлой неделе я работал над тем же вопросом: -)

Я создаю экземпляр контекста данных внутри очень тонкой оболочки и помещаю контекст в словарь HttpContext.Current.Items. Таким образом, контекст является глобальным, но только для текущего запроса.

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

0 голосов
/ 10 августа 2009

Самый простой способ - иметь строку подключения, которую вы определяете в web.config для разработки и производства. Для юнит-тестов вы определяете это в app.config вашего Testproject.

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