我对C++中使用Catch2进行单元测试是新手。最后,我试图实现一个自定义的Matcher来测试给定对象的字段是否与我提供的字段匹配。所讨论的对象将是:
class Book {
private:
int chapters;
int pages;
public:
int GetChapters();
int GetPages();
};
我的matcher将在测试用例中这样使用:
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)'的抽象返回类型无效 *
- 错误:转换为抽象类类型'BookCheck'的无效强制转换 *
你能告诉我我哪里做错了吗?
1条答案
按热度按时间pieyvz9o1#
您的
match
方法重写格式不佳。Catch::MatcherBase::match
将object作为常量的引用,因此object在方法体中不会被修改。Catch::MatcherBase::match
的签名为:所以你的
match
覆盖实现应该是:此外,您需要标记您的
Book
gettersconst
,以保持const correctness: