【问题标题】:How to implement a custom matcher to check for object equality in Catch2如何实现自定义匹配器以检查 Catch2 中的对象相等性
【发布时间】:2020-02-06 15:07:44
【问题描述】:

我是使用 Catch2 在 C++ 中进行单元测试的新手。最后,我试图实现custom 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’

你能指出我在这里做错了什么吗?

【问题讨论】:

标签: c++ unit-testing abstract-class catch2


【解决方案1】:

您的match 方法覆盖格式错误。Catch::MatcherBase::match 将对象作为对常量的引用,因此不会在方法主体中修改对象。 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 以保留const correctness

int GetChapters() const;
int GetPages() const;

【讨论】:

    猜你喜欢
    • 2012-03-16
    • 2015-06-27
    • 2016-04-18
    • 1970-01-01
    • 2020-05-13
    • 1970-01-01
    • 1970-01-01
    • 2013-12-20
    相关资源
    最近更新 更多