ошибки компилятора при инициализации EXPECT_CALL с функцией, в которой параметром program_options :: variable_map является параметр - PullRequest
1 голос
/ 25 января 2012

У меня проблема с методом EXPECT_CALL, при попытке сделать это:

boost::program_options::variables_map vm;  
MyMock mock;  
EXPECT_CALL(mock, MyMethod(vm)).WillOnce(Return(L""));  

MyMethod выглядит так:

std::wstring MyMethod(const boost::program_options::variables_map &vm)

При компиляции я получил ошибки:

Error   17  error C2676: binary '==' : 'const boost::program_options::variable_value' does not define this operator or a conversion to a type acceptable to the predefined operator C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\utility   

Error   10  error C2784: 'bool std::operator ==(const _Elem *,const std::basic_string<_Elem,_Traits,_Alloc> &)' : could not deduce template argument for 'const _Elem *' from 'const boost::program_options::variable_value'    C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\utility

И еще несколько похожих ошибок.

Ответы [ 2 ]

1 голос
/ 27 января 2012

Кроме того, вы можете создать свой собственный предикат в качестве сопоставителя, как я обнаружил, что мне нужно было это сделать при попытке сопоставить с boost.

См. здесь .

В вашем тесте:

using :testing::Return;
using ::testing::Truly;
EXPECT_CALL( object , connectSlot( Truly( PredicateFunc ) ) ).Times( 1 ).WillOnce(Return( boost::signals::connection() ) );

пока у вас есть функция (или функтор)

bool PredicateFunc( boost::signal0<void>::slot_type const& slot )
{
    /* Custom matcher code */
    return true | false;
}
0 голосов
/ 25 января 2012

Чтобы использовать EXPECT_CALL, ваш класс должен поддерживать operator==. Поскольку boost::program_options::variables_map не имеет operator==, вы не можете использовать его таким образом.

Вы можете определить свой собственный сопоставитель для boost::program_options::variables_map, однако я бы посоветовал вам передать его в функцию , где вы будете проверять ожидаемые значения (или вы можете игнорировать, установить флаг или делай что хочешь). Примерно так:

int called = 0;
void foo( const boost::program_options::variables_map &)
{
  ++ called;
}

В тесте:

boost::program_options::variables_map vm;  
MyMock mock;
called = 0;
EXPECT_CALL(mock, MyMethod(_)).WillOnce(Invoke(&foo));  
// assert that called is 1
...