Как реализовать пользовательский сопоставитель для проверки равенства объектов в Catch2 - PullRequest
0 голосов
/ 06 февраля 2020

Я новичок в модульном тестировании в C ++ с Catch2 . Наконец, я пытался реализовать пользовательский Matcher , чтобы проверить, совпадают ли поля данного объекта с теми, которые я предоставляю. Обсуждаемый объект должен выглядеть следующим образом:

class Book {
private:
    int chapters;
    int pages;

public:
    int GetChapters();
    int GetPages();
};

Мой тестер будет использоваться следующим образом в тестовом примере:

TEST_CASE("Books info is correct")
{
    Book myBook;
    CHECK_THAT(myBook, IsCorrect(5, 150));
    CHECK_THAT(myBook, IsCorrect(10, 325));
}

Следуя примеру в документации, я намеревался:

// The matcher class
class BookCheck : public Catch::MatcherBase<Book> {
    Book book;
    int chapters = -1;
    int pages = -1;

public:
    BookCheck(int chapters, int pages) : chapters(chapters), pages(pages) {}

    // Performs the test for this matcher
    bool match( Book& b ) const override {
        return b.GetChapters() == chapters && b.GetPages() == pages;
    }

    virtual std::string describe() const override {
        ostringstream ss;
        //ss << "is between " << m_begin << " and " << m_end; // TODO
        return ss.str();
    }
};

// The builder function
inline BookCheck IsCorrect(int chapters, int pages) {
    return BookCheck(chapters, pages);
}

Когда я компилирую этот код, я получаю следующие ошибки:

ошибка: 'bool BookCheck :: match (Book &) const' помечен как 'переопределить', но не переопределить

ошибка: недопустимый абстрактный тип возвращаемого значения 'BookCheck'

ошибка: недопустимый абстрактный тип возвращаемого значения для функции 'BookCheck IsCorrect (int, int) '

ошибка: неверное приведение к абстрактному типу класса' BookCheck '

Не могли бы вы указать мне, что я делаю здесь неправильно?

1 Ответ

2 голосов
/ 06 февраля 2020

Ваше переопределение метода match неправильно сформировано. Catch::MatcherBase::match принимает объект как ссылку на const, поэтому объект не будет изменен в теле метода. Подпись для Catch::MatcherBase::match:

virtual bool match(ObjectT const& arg) const

Итак, ваша реализация переопределения match должна быть:

bool match(Book const& b) const override {
    return b.GetChapters() == chapters && b.GetPages() == pages;
}

Дополнительно. Вам необходимо пометить Ваши Book getters const сохранить постоянную правильность :

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