如何实现自定义匹配器以检查 Catch2 中的对象相等性
How to implement a custom matcher to check for object equality in Catch2
我是 C++ 单元测试的新手,使用 Catch2. Lastly, I was trying to implement a 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' 标记为'override',但没有覆盖
错误:无效摘要return键入“BookCheck”
错误:函数“BookCheck”的抽象 return 类型无效
IsCorrect(int, int)'
错误:转换为抽象 class 类型无效
“簿记”
你能指出我这里做错了什么吗?
您的 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
吸气剂 const
以保持 const correctness:
int GetChapters() const;
int GetPages() const;
我是 C++ 单元测试的新手,使用 Catch2. Lastly, I was trying to implement a 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' 标记为'override',但没有覆盖
错误:无效摘要return键入“BookCheck”
错误:函数“BookCheck”的抽象 return 类型无效 IsCorrect(int, int)'
错误:转换为抽象 class 类型无效 “簿记”
你能指出我这里做错了什么吗?
您的 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
吸气剂 const
以保持 const correctness:
int GetChapters() const;
int GetPages() const;