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

6ljaweal  于 2023-06-25  发布在  其他
关注(0)|答案(1)|浏览(172)

我对C++中使用Catch2进行单元测试是新手。最后,我试图实现一个自定义的Matcher来测试给定对象的字段是否与我提供的字段匹配。所讨论的对象将是:

  1. class Book {
  2. private:
  3. int chapters;
  4. int pages;
  5. public:
  6. int GetChapters();
  7. int GetPages();
  8. };

我的matcher将在测试用例中这样使用:

  1. TEST_CASE("Books info is correct")
  2. {
  3. Book myBook;
  4. CHECK_THAT(myBook, IsCorrect(5, 150));
  5. CHECK_THAT(myBook, IsCorrect(10, 325));
  6. }

按照文档中的示例,我的意图是:

  1. // The matcher class
  2. class BookCheck : public Catch::MatcherBase<Book> {
  3. Book book;
  4. int chapters = -1;
  5. int pages = -1;
  6. public:
  7. BookCheck(int chapters, int pages) : chapters(chapters), pages(pages) {}
  8. // Performs the test for this matcher
  9. bool match( Book& b ) const override {
  10. return b.GetChapters() == chapters && b.GetPages() == pages;
  11. }
  12. virtual std::string describe() const override {
  13. ostringstream ss;
  14. //ss << "is between " << m_begin << " and " << m_end; // TODO
  15. return ss.str();
  16. }
  17. };
  18. // The builder function
  19. inline BookCheck IsCorrect(int chapters, int pages) {
  20. return BookCheck(chapters, pages);
  21. }

当我编译这段代码时,我得到了以下错误:

  • 错误:'bool BookCheck::match(Book &)const'标记为'override',但不覆盖 *
  • 错误:抽象返回类型'BookCheck'无效 *
  • 错误:函数'BookCheck IsCorrect(int,int)'的抽象返回类型无效 *
  • 错误:转换为抽象类类型'BookCheck'的无效强制转换 *

你能告诉我我哪里做错了吗?

pieyvz9o

pieyvz9o1#

您的match方法重写格式不佳。Catch::MatcherBase::match将object作为常量的引用,因此object在方法体中不会被修改。Catch::MatcherBase::match的签名为:

  1. virtual bool match(ObjectT const& arg) const

所以你的match覆盖实现应该是:

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

此外,您需要标记您的Book getters const,以保持const correctness

  1. int GetChapters() const;
  2. int GetPages() const;

相关问题