Google Test (gtest): ASSERT_PREDx и функции-члены класса

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

class A {
    /* Private members */
public:
    bool function_to_test(int index);
}

В тестовой функции я хотел бы использовать:

A testEntity;
const int b = 40;
ASSERT_PRED1(testEntity.function_to_test, b);

Это не работает, поскольку ASSERT_PREDx, похоже, предназначено для функций глобальной области видимости. Я получаю сообщение в строках

argument of type ‘bool (A::)(int) {aka bool (A::)(int)}’ does not match ‘bool (A::*)(int)’

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


person Doug    schedule 18.01.2013    source источник
comment
вы пытались сделать function_to_test статической функцией-членом?   -  person TemplateRex    schedule 18.01.2013


Ответы (1)


Первый аргумент ASSERT_PRED1(pred1, val1); должен быть вызываемым объектом; унарная функция или функтор.

Например, если вы можете использовать лямбда-выражения С++ 11, вы можете сделать:

ASSERT_PRED1([&testEntity](int i) { return testEntity.function_to_test(i); }, b);

Или, если вы хотите использовать помощник унарной функции:

struct TesterA : public std::unary_function <int, bool> {
  explicit TesterA(A& a) : a_(a) {}
  bool operator()(int i) { return a_.function_to_test(i); }
  A& a_;
};

ASSERT_PRED1(TesterA(testEntity), b);
person Fraser    schedule 19.01.2013
comment
Интересно - я никогда раньше не использовал функцию лямбда-функций C++; Я должен изучить это. И перегрузка оператора () структуры мне бы в голову не пришла. Большое спасибо! - person Doug; 19.01.2013