我想创建一个有助于c ++单元测试的宏。我不想为测试目的创建一个新对象。 是否可以传递类函数引用,如(ClassName :: function)?
#define TEST(func_ptr,X,Expercted) \
(__extension__ ( \
{ \
__typeof__(X) __x = (X); \
__typeof__(Expercted) __y = (Expercted); \
result= funct_ptr(__x);\
//------- do some testing stuffs-----\
} \
))
我有一个A类及其方法square()
int main(){
TEST(&A::square,2,4);
return 0;
}
我想测试square函数是否返回true值。
以上代码会出错。如何解决问题。其他方面的解决方案值得注意
答案 0 :(得分:2)
您正在传递一个非静态成员函数指针,这需要一个类实例来调用。如果将其更改为静态成员或免费功能,则应该可以正常工作。
class A{
...
static bool square(...);
};
TEST(A::square,...);
或
bool square(...);
TEST(square,...);
你的宏也有一个错字 - func_ptr vs funct_ptr
答案 1 :(得分:2)
根据标准,如果不创建对象,则无法调用非静态成员函数。这就是为什么你应该创建A
的对象(对于例如A a
)并像这样调用
A a;
TEST( std::bind( &A::square, &a ), 2, 4 );
如果您问这样使用宏是不是一个好主意,我会告诉您 - 不。写一个函数代替。喜欢这个
template< class F, class Ex >
bool test( F f, Ex expected ) {
Ex res = f();
return res == expected;
}
...
assert( test( std::bind( &A::square, &a, 2 ), 4 ) );