Я столкнулся с проблемой в проекте, где у нас есть проблемы с некоторыми сторонними классами. Проблема в том, что мы не можем создать экземпляры классов от третьей стороны, потому что мы получаем только представления метаданных, но мы можем исправить это с помощью шаблона адаптера. Проблема в том, что класс, который нам нужен для модульного тестирования, реализует сторонние интерфейсы:
public class OurClass: ThirdPartyInterface
{
}
Эти интерфейсы возвращают сторонние классы (те, которые мы можем переносить через шаблон адаптера), но они возвращаются как исходные. Поэтому нам нужно как-то создать какую-то интерфейсную систему адаптера.
На сегодняшний день наша лучшая идея - создать класс (FacadeThirdParty), который реализует ThirdpartyInterface, затем обернуть сторонние классы, поступающие из интерфейса (TPClass), в класс адаптера (TPClassAdapter) и затем отправить его через наш собственный интерфейс. (IFacadeThirdPartyInterface), который реализует «OurClass»:
Таким образом, мы можем использовать интерфейсы класса IFacadeThirdPartyInterface и класса адаптера, чтобы их не беспокоили третьи лица. Эта идея хороша? Я чувствую, что может быть лучший способ сделать это.
ОБНОВЛЕНИЕ: Новое предлагаемое решение
Итак, после некоторых мыслей и того, что было сказано в комментариях, я думаю, что у меня есть новое решение, которое будет работать:
Проблема, с которой я столкнулся, которую я, возможно, не очень хорошо объяснил, заключалась в том, что функции обратного вызова использовались сторонней системой. Итак, что я сделал здесь, так это то, что у нас есть «OurClass», который мне нужен для модульного тестирования. Теперь он будет общаться со слоем Facade и получать обратные вызовы через интерфейс IFacadeCallback. Все сторонние интерфейсы будут реализованы в классе фасадов. Когда один из этих интерфейсов выполняет вызов к фасаду, он перенаправляет его через фасад IFacadeCallback. Если вызов имеет сторонние классы, он обернет их в класс адаптера и вернет интерфейс этого класса (ITPClass). Теоретически это должно изолировать «OurClass», чтобы я мог использовать Moq для проверки его функций.