Я не эксперт в том, как правильно разбивать юнит-тестирование с помощью макетов и всего остального, но я могу поделиться своим опытом проведения интеграционного тестирования с WCF / базой данных базы данных.
По сути, мы использовали singleton для обработки всего кода запуска. Другими словами, метод MyClassInitialize будет вызывать статический метод, который будет гарантировать, что хосты / база данных службы запущены и работают. Таким образом, нам не нужно было настраивать / разбирать бэкэнд для каждого набора юнит-тестов.
[ClassInitialize]
public static void MyClassInitialize(TestContext testContext)
{
GlobalBackend.EnsureStarted();
}
Я не знаю ни одного примера в Интернете, вам, вероятно, придется поискать еще немного.
Что касается степени детализации ваших тестов, вы говорили об интеграционных тестах. Это звучит так, как будто вы, вероятно, хотите проверить свои сервисные вызовы, привязанные к реальной базе данных. Скажем, у вас есть некоторые функции CRUD, встроенные в ваши службы, один модульный тест (интеграционный тест в этом контексте) может создать виджет (или любой другой), а затем выполнить вызов loadWidget, чтобы убедиться, что виджет создан правильно.
Сколько тестов нужно выполнить в одном модульном тесте (в зависимости от того, проводите ли вы интеграционное тестирование или более детальное модульное тестирование) - предмет, который может заполнить многие книги.
РЕДАКТИРОВАТЬ: Вам также может потребоваться выполнить очистку / отключение базы данных / служб:
Страница MSDN в Атрибут AssemblyCleanup .
[AssemblyCleanup()]
public static void AssemblyCleanup()
{
GlobalBackend.ShutDown();
}
Конечно, это может привести к вводу всего кода запуска:
[AssemblyInitialize()]
public static void AssemblyInit(TestContext context)
{
GlobalBackend.EnsureStarted();
}
Так что теперь я помню более ясно - мы закончили тем, что сделали это в конце (меньше кода)