Базовые макеты могут создавать только макеты для интерфейсов и абстрактных классов (но только для абстрактных / виртуальных методов).
Поскольку ObjectContext не является ни абстрактным, ни интерфейсным, его не так легко высмеять. Однако, поскольку контейнер конкретной модели генерируется как частичный класс (если вы используете конструктор), вы можете извлечь необходимые методы / свойства из него в интерфейс. В вашем коде вы можете использовать только тот интерфейс, который вы можете потом высмеивать.
С ObjectQuery это немного проще, поскольку он имеет базовый интерфейс (например, IQueryable), который в основном содержит все необходимые операции, которые вам обычно нужны (и требуются для LINQ). Таким образом, вы должны представить IQueryable вместо ObjectQuery в вашей бизнес-логике, и вы можете создать макет для этого интерфейса.
Другая альтернатива - скрыть всю логику, связанную с доступом к данным, в отдельном слое (с минимальной логикой), протестировать этот слой с помощью интеграционных тестов и смоделировать его, чтобы иметь возможность модульного тестирования других уровней.
Существуют инструменты (я знаю только TypeMock ), которые используют профилирующие перехватчики .NET для генерации макетов. Эти инструменты не ограничиваются макетами интерфейсов или абстрактных классов, но с их помощью вы можете макетировать практически все, включая не виртуальные и статические методы. С таким инструментом вам не нужно менять свою бизнес-логику, чтобы допустить насмешку.
Хотя этот подход иногда полезен, вы должны знать, что извлечение зависимостей для интерфейсов (IoC) не только полезно для насмешек, но также уменьшает зависимости между вашими компонентами, что также имеет другие преимущества.
Лично мне нравится Rhino.Mocks лучшее из бесплатных инструментов, но мы также используем TypeMock , который также является отличным продуктом (но вы должны заплатить за него ).