Создание интерфейса для макета объектов C ++ - PullRequest
1 голос
/ 23 марта 2012

У меня есть проект Visual Studio 2008 C ++, где я реализую модульные тесты для класса, который использует boost::asio::ip::udp::socket.Чтобы добраться до тестируемости модуля, мне нужно иметь возможность передать Mock этого объекта сокета.

Моя проблема в том, что у вас не может быть функции виртуального шаблона, а boost :: asio имеет сильно шаблонизированного пользователяinterface.

Как создать интерфейс для макета библиотеки C ++, использующей шаблоны?

// socket interface that can be mocked
class IUDPSocket
{
public:
    virtual void open( const boost::asio::ip::udp& protocol ) = 0;

    // problem!
    template <typename SettableSocketOption>
    virtual void set_option( const SettableSocketOption& option ) = 0;

    virtual void bind( const boost::asio::ip::udp::endpoint& endpoint ) = 0;

    // Problem! 
    template <typename MutableBufferSequence, typename ReadHandler>
    virtual void async_receive_from( 
        const MutableBufferSequence& buffers,
        boost::asio::ip::udp::endpoint& sender_endpoint,
        ReadHandler handler ) = 0;

protected:
    virtual ~IUDPSocket() = 0;
};

// socket class that will be used for "normal" operation.
class BoostUDPSocket
{
    // ...

    virtual void open( const boost::asio::ip::udp& protocol )
    {
        socket_.open( protocol );
    };

private:
    boost::asio::ip::udp::socket socket_;
}; 

Если это имеет значение, я использую Google Test в качестве основы для модульного тестирования.*

Спасибо

1 Ответ

0 голосов
/ 23 марта 2012

Две возможности:

  1. Не используйте типы из boost::asio в вашем интерфейсе напрямую, используйте абстракцию, если типы достаточно сложные: IMutableBufferSequence, IEndpoint и т. Д ...
  2. Шаблонизируйте весь ваш интерфейс относительно типов, используемых в методах, но тогда возникает вопрос: вам вообще нужен полиморфный тип "interface"?
...