如何实现自定义匹配器以检查 Catch2 中的对象相等性

How to implement a custom matcher to check for object equality in Catch2

本文关键字:Catch2 检查 对象 何实现 实现 自定义      更新时间:2023-10-16

我是 Catch2 C++的单元测试新手。最后,我尝试实现一个自定义匹配器来测试给定对象的字段是否与我提供的字段匹配。有问题的对象是这样的:

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"标记为"override",但不覆盖

错误:无效的抽象返回类型"BookCheck">

错误:函数"BookCheck"的抽象返回类型无效 IsCorrect(int, int('

错误:强制转换为抽象类类型无效 "图书检查">

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

您的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;
}

此外,您需要标记您的Bookgetterconst以保持常量正确性:

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