2010-09-03 4 views
3

Еще один «простой» вопрос об объектах модели единого тестирования, использующих уровень доступа к данным.Mocking LINQ To SQL поставщик данных, NotSupportedException on Live code

Когда я дразнить мой Table<Customer> в IQuerable<ICustomer>, где new List<FakeCustomer>().AsQuerable() используется в роли в памяти хранилища данных, следующий код проходит модульное тестирование отлично:

var filteredCustomers = from c in dal.Customers 
         where c.Code.ToUpperInvariant() == "ABC" 
         select c; 

При запуске приложения я, конечно, получить NotSupportedException (из-за ToUpperInvariant()). Может быть, это довольно хромой пример, потому что проблему можно устранить, заменив ToUpperInvariant() на ToUpper(), но вы поняли суть.

Вопрос: является ли такое несоответствие «платой» за запись реального блока, но не интеграционными тестами? Или, может быть, я что-то делаю неправильно, например. должен быть другой способ издеваться над DataContext таким образом, чтобы полностью имитировать Linq To SQL DataContext?

В настоящее время я размещаю тестовую базу данных, а не в макете памяти, чтобы поймать такие ошибки.

Спасибо за ваши предложения.

ответ

4

Да, это как раз плата, которую вы платите за это, не являясь тестом интеграции. Разумеется, неплохо иметь интеграционные тесты, а также модульные тесты.

Трудно избежать подобной проблемы с ORM, на мой взгляд - как вы собираетесь точно эмулировать весь SQL Server без запуска SQL Server? Это не означает, что ORM бесполезны или что-то в этом роде - просто есть ограничения.

+0

Ahh, извините. Я уже установил «Объекты» в «SQL». Пятница, была пьяна :). Спасибо за быстрый ответ и отметив неправильный термин – Roman

+0

@ Roman: Нет проблем. Редактировал мой ответ :) –

Смежные вопросы