Мы применяем несколько подходов, в зависимости от того, какие функции WCF действительно входят в объем теста:
Если единственной необходимой функцией действительно является внешняя транзакция (как это происходит с [OperationBehavior (TransactionAutoCompete = true, TransactionScopeRequired = true)]), то мы просто пишем оболочку вокруг реализации службы, которая устанавливает и завершает транзакцию как сделал бы WCF. Затем мы вызываем эту оболочку и, следовательно, реализацию напрямую, то есть не через WCF.
Если требуются более сложные или расширенные функции, мы стараемся по крайней мере переключить транспорт на именованные каналы. Похоже, они быстрее, в том числе открывать / закрывать.
Если важны даже параметры привязки / протокола, можно утверждать, что, по крайней мере, сейчас вы действительно выполняете интеграцию, а не модульное тестирование, YMMV. Но в любом случае в этом случае мы просто используем сервис как есть.