std :: function не является производной от 'std :: reference_wrapper <_Tp>' - PullRequest
0 голосов
/ 24 мая 2018

Попытка юнит-тестирования приватного метода обратного вызова класса.Обратный вызов регистрируется с помощью функции, которую я могу смоделировать, а затем с помощью EXPECT_CALL и SaveArg я могу перехватить функцию обратного вызова в тестовом члене std :: function и вызвать ее для целей тестирования.Это прекрасно работает.

Проблема начинается, когда сам метод обратного вызова принимает в качестве параметра std :: function.

Код продукции:

Частный метод обратного вызоваЯ пытаюсь проверить:

void
MyClass::callbackMethod(const Callback callback)

Обратный вызов, который берется в качестве параметра для callbackMethod:

typedef std::function< void(void) > Callback;

Открытая функция, в которой связан обратный вызов:

void
MyClass::initialize(const Callback callback)
{
      m_SomeClass->registerCallback(std::bind(&MyClass::callbackMethod, this, callback));
}

Код теста:

Член класса Tets, в который я пытаюсь сохранить аргумент обратного вызова из функции регистра:

std::function< void(const Callback callback) > m_Callback;

Что здесь должно произойти:

EXPECT_CALL(*m_SomeClassMock, registerCallback(_))
         .WillOnce(SaveArg< 0 >(&m_Callback));

Выдает следующую ошибку:

...
/usr/include/c++/6/functional:1999:2: note: candidate: template<class _Functor> std::function<_Res(_ArgTypes ...)>& std::function<_Res(_ArgTypes ...)>::operator=(std::reference_wrapper<_Functor>) [with _Functor = _Functor; _Res = void; _ArgTypes = {std::function<void(void)>}]
  operator=(reference_wrapper<_Functor> __f) noexcept
  ^~~~~~~~
/usr/include/c++/6/functional:1999:2: note:   template argument deduction/substitution failed:
In file included from .../ext-cppunit-google-mock-dev/5/workspace/usr/include/gmock/gmock.h:65:0,
                 from .../SomeClassMock.hpp:15,
                 from .../MyTest.cpp:16:
.../gmock/gmock-more-actions.h:172:12: note:   'std::function<void(void)>' is not derived from 'std::reference_wrapper<_Tp>'
   *pointer = ::testing::get<k>(args);
   ~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~

Не уверен, что причиной этой ошибки может быть тот факт, что в последней строке ошибки, вероятно, должно быть:

std::function<void(std::function<void(void)>)>

дает какую-то подсказку?

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