GoogleMock Eq: не вызывается оператор сравнения класса

232
15 января 2018, 09:07

У меня есть такой код:

class Money
{
};
class Dollar : public Money
{
public:
    Dollar(int amount);
    Dollar times(int value);
    bool operator==(const Dollar& dollar);
    int amount;
};
Dollar::Dollar(int amount)
    : amount(amount)
{
}
Dollar Dollar::times(int value)
{
    return Dollar(amount * value);
}
bool Dollar::operator==(const Dollar& dollar)
{
    return amount == dollar.amount;
}

Я хочу его протестировать, используя GoogleMock:

#include <gmock\gmock.h>
using ::testing::Eq;
TEST(Money, TestDollarMultiplication)
{
    Dollar five(5);
    Dollar product = five.times(2);
    ASSERT_THAT(product.amount, Eq(10));
    product = five.times(3);
    ASSERT_THAT(product.amount, Eq(15));
}

Этот тест работает, но я хочу сделать его чистым и написать как-то так:

TEST(Money, TestDollarMultiplication)
{
    Dollar five(5);
    Dollar product = five.times(2);
    ASSERT_THAT(product, Eq(Dollar(10)));
}

или

ASSERT_THAT(five.times(2), Eq(Dollar(10)));

Обратите внимание, что в Eq(Dollar(10)) передается r-value.

Этот код не компилируется:

error C2678: бинарный "==": не найден оператор, принимающий левый операнд типа "const Dollar" (или приемлемое преобразование отсутствует)

Мне предлагают посмотреть во внутренности библиотеки:

namespace internal {
struct AnyEq {
  template <typename A, typename B>
  bool operator()(const A& a, const B& b) const { return a == b; }
};

В чем здесь проблема и как ее исправить?

Answer 1

У вашего оператора сравнения отсутствует const квалификатор (как и у функции times).

bool operator==(const Dollar& dollar) const;
bool Dollar::operator==(const Dollar& dollar) const
{
    return amount == dollar.amount;
}

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

const Dollar five(5);
READ ALSO
Вызвано исключение в c++

Вызвано исключение в c++

Этот код вызывает ошибку:

285
Что делают функции begin() и end()

Что делают функции begin() и end()

Нигде не могу найти описание функций begin() и end(), для чего они нужны? Если можно напишите пример пожалуйста :)

315
Для чего нужен static_cast, как он работает и где его применяют?

Для чего нужен static_cast, как он работает и где его применяют?

У static_cast очень много различных примененийЕго идея состоит в следующем: это ограниченный по мощи C-style cast

333
Максимальный обьем кучи С++

Максимальный обьем кучи С++

Какой максимальный обьем кучи? Если у стека приблизительно: 4 MB?

235