我正在进行VS2010到2012的更新,有几个单元测试失败了,可能是由于错误的代码生成或编程错误,但我不确定。
我发布的代码与原始代码几乎相同,并且也能复现问题。
以下是一个示例,所有类/实现都在单独的文件中。
class Base
{
public:
virtual ~Base(){}
void DoIt(){ DoItImpl(); }
protected:
virtual void DoItImpl() = 0;
};
class Base2 : public Base
{
public:
virtual void DoStuff() = 0;
};
class Impl : public Base2
{
public:
Impl();
void DoStuff();
protected:
void DoItImpl();
};
void Impl::DoStuff()
{
throw std::runtime_error( "oops" );
}
void Impl::DoItImpl()
{
throw std::runtime_error( "oops" );
}
上述代码位于动态链接库中,并且在可执行文件中使用unittest++进行测试(为了清晰起见,我扩展了CHECK_THROW
宏,但并没有改变任何东西):
SUITE( Base )
{
TEST( Impl )
{
Impl c;
bool caught = false;
try
{
c.DoIt();
}
catch( const std::exception& )
{
caught = true;
}
//this point is never reached, instead control goes to the
//try/catch in unittest++'s ExecuteTest function
CHECK( caught );
}
}
无论是不是一个错误,我是否能够立即使用一些解决方法或避免这种情况的一般规则呢?
编辑:如果我调用
DoStuff()
而不是DoIt()
就没有问题!编辑:这应该排除了单元测试框架或任何其他代码的问题,或者通过const引用来捕获,或者编译器不知道
runtime_error
派生自异常的可能性; 我扩展了单元测试宏以显示它们实际上要做什么,并创建了一个仅包含此源文件的新项目。namespace SuiteImpl
{
class TestImpl
{
public:
TestImpl() {}
virtual void RunImpl() const;
};
void TestImpl::RunImpl() const
{
xxx::Impl c;
try
{
c.DoIt();
}
catch( std::exception& )
{
std::cout << "good" << std::endl;
}
}
}
int main()
{
SuiteImpl::TestImpl impl;
try
{
impl.RunImpl();
}
catch( const std::exception& )
{
std::cout << "not good" << std::endl;
}
}
输出结果
不好
。