Модульное тестирование Linq 2 Sql лениво-загруженных свойств - PullRequest
2 голосов
/ 13 октября 2009

Допустим, у меня есть таблица «Клиенты» и таблица «Заказы» с привязкой «один ко многим» (один клиент может иметь несколько заказов). Если у меня есть какой-то код, который я хотел бы выполнить модульным тестом, который получает доступ к заказам конкретного клиента через ленивую загрузку (например, вызов customer.Orders), как я могу издеваться над заглушкой / заглушкой, чтобы она не попала в базу данных?

Edit:

Чтобы быть более понятным, давайте использовать более конкретный пример. Допустим, я хочу вернуть все заказы для конкретного клиента. Я мог бы написать это так, используя автоматически сгенерированные свойства отложенной загрузки, которые предоставляет Linq 2 Sql:

Customer customer = customerRepository.GetCustomerById(customerId);

return customer.Orders;

Однако, модульное тестирование это немного сложно. Я могу смоделировать вызов GetCustomerById, но не могу (насколько я могу судить) смоделировать вызов Orders. Единственный способ подумать о модульном тестировании - это а) подключиться к базе данных (что замедлит мои тесты и будет хрупким), или б) не использовать свойства отложенной загрузки.

Не используя свойства отложенной загрузки, я, вероятно, переписал бы вышеизложенное как это:

return orderRepository.GetOrdersByCustomerId(customerId);

Это определенно работает, но неудобно полностью игнорировать свойства отложенной загрузки просто для модульного тестирования.

1 Ответ

2 голосов
/ 13 октября 2009

В качестве общего ответа на ваш вопрос, вы заглушаете этот вызов так же, как заглушаете что-то еще.

Я предполагаю, что код, который вы хотите использовать для модульного тестирования, является потребителем вашего компонента доступа к данным, так как это наиболее распространенный сценарий. Вы можете заблокировать доступ к данным, только если вы программируете на интерфейсе . Это означает, что вы должны скрыть детали реализации L2S за интерфейсом так, чтобы потребительский код не знал, какую реализацию он использует в настоящее время.

Следствием этого является то, что ленивая загрузка - это деталь реализации, о которой вам не нужно беспокоиться при модульном тестировании, поскольку в модульном тесте вообще не следует использовать L2S.

При заглушении уровня доступа к данным вызов customers.Orders обычно будет вызовом свойства заглушки в памяти.

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