Вы создаете DbSet с помощью метода Factory (Set) в контексте, но вам не нужна зависимость от EF в модульном тесте.Поэтому вам нужно посмотреть на реализацию заглушки DbSet с использованием интерфейса IDbSet или заглушку с использованием одной из сред Mocking, таких как Moq или RhinoMock.Предполагая, что вы написали свою собственную заглушку, вы просто добавили бы объекты WeightEntry во внутренний хэш-набор.
Возможно, вам больше повезет узнать о модульном тестировании EF, если вы будете искать ObjectSet и IObjectSet.Это аналоги DbSet до выхода первого CTP-кода, и о них написано гораздо больше с точки зрения модульного тестирования.
Вот отличная статья на MSDN, в которой обсуждается возможность тестирования EFкод.Он использует IObjectSet, но я думаю, что он все еще актуален.
В ответ на комментарий Дэвида я добавляю это дополнение ниже, поскольку оно не помещается в -комментарии.Не уверены, что это лучший метод для ответов на длинные комментарии?
Вам следует изменить интерфейс IWeightTrackerContext, чтобы он возвращал IDbSet из свойства WeightEntries, а не конкретный тип DbSet.Затем вы можете создать MockContext с помощью фреймворка (рекомендуется) или своей собственной заглушкой.Это вернет StubDbSet из свойства WeightEntries.
Теперь у вас также будет код (т.е. пользовательские репозитории), который зависит от IWeightTrackerContext, который в процессе работы вы передадите в свой Entity Framework WeightTrackerContext, который будет реализовывать IWeightTrackerContext.Как правило, это делается путем внедрения конструктора с использованием инфраструктуры IoC, такой как Unity.Для тестирования кода репозитория, который зависит от EF, вы должны передать свою реализацию MockContext, чтобы тестируемый код думал, что он взаимодействует с «реальным» EF и базой данных, и ведет себя (надеюсь) как и ожидалось.После того как вы удалили зависимость от изменяемой внешней системы БД и EF, вы сможете надежно проверять вызовы репозитория в своих модульных тестах.
Большая часть фреймворков предоставляет возможность проверять вызовы объектов Mock длятест поведенияВ приведенном выше примере ваш тест на самом деле только тестирует функциональность DbSet Add, которая не должна вас беспокоить, поскольку у MS для этого будут модульные тесты.То, что вы хотели бы знать, - это то, что вызов Add on DbSet был сделан из вашего собственного кода репозитория, если это уместно, и именно здесь вступают фреймворки Mock.
Извините, я знаю, что это оченьно если вы прочтете эту статью, многое станет яснее, поскольку Скотт Аллен гораздо лучше объясняет эти вещи, чем я :))