Адаптация интерфейсов для Moq unittest - PullRequest
0 голосов
/ 07 января 2019

Я столкнулся с проблемой в проекте, где у нас есть проблемы с некоторыми сторонними классами. Проблема в том, что мы не можем создать экземпляры классов от третьей стороны, потому что мы получаем только представления метаданных, но мы можем исправить это с помощью шаблона адаптера. Проблема в том, что класс, который нам нужен для модульного тестирования, реализует сторонние интерфейсы:

public class OurClass: ThirdPartyInterface
{

}

Эти интерфейсы возвращают сторонние классы (те, которые мы можем переносить через шаблон адаптера), но они возвращаются как исходные. Поэтому нам нужно как-то создать какую-то интерфейсную систему адаптера.

На сегодняшний день наша лучшая идея - создать класс (FacadeThirdParty), который реализует ThirdpartyInterface, затем обернуть сторонние классы, поступающие из интерфейса (TPClass), в класс адаптера (TPClassAdapter) и затем отправить его через наш собственный интерфейс. (IFacadeThirdPartyInterface), который реализует «OurClass»:

Diagram over our best idea

Таким образом, мы можем использовать интерфейсы класса IFacadeThirdPartyInterface и класса адаптера, чтобы их не беспокоили третьи лица. Эта идея хороша? Я чувствую, что может быть лучший способ сделать это.

ОБНОВЛЕНИЕ: Новое предлагаемое решение

Итак, после некоторых мыслей и того, что было сказано в комментариях, я думаю, что у меня есть новое решение, которое будет работать:

enter image description here

Проблема, с которой я столкнулся, которую я, возможно, не очень хорошо объяснил, заключалась в том, что функции обратного вызова использовались сторонней системой. Итак, что я сделал здесь, так это то, что у нас есть «OurClass», который мне нужен для модульного тестирования. Теперь он будет общаться со слоем Facade и получать обратные вызовы через интерфейс IFacadeCallback. Все сторонние интерфейсы будут реализованы в классе фасадов. Когда один из этих интерфейсов выполняет вызов к фасаду, он перенаправляет его через фасад IFacadeCallback. Если вызов имеет сторонние классы, он обернет их в класс адаптера и вернет интерфейс этого класса (ITPClass). Теоретически это должно изолировать «OurClass», чтобы я мог использовать Moq для проверки его функций.

1 Ответ

0 голосов
/ 07 января 2019

Я бы вместо использования шаблона адаптера вставил бы зависимость от третьей стороны в класс, который вы хотите протестировать, например,

public class OurClass
{
    public OurClass(IThirdPartyInterface thirdParty)
    {
        _thirdParty = thirdParty;
    }
    private readonly IThirdPartyInterface _thirdParty;
}

А интерфейс IThirdPartyInterface будет простым интерфейсом с методом / свойствами, которые требуются в вашем коде из класса ThirdPartyInterface.

Делая это таким образом, вы легко можете смоделировать зависимости, которые есть у этого класса, плюс это также основывается на принципе обращения зависимостей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...