ここで 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" );
}
上記はdllにあり、exeで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 );
}
}
バグであるかどうかにかかわらず、すぐに使用できる回避策、またはこれを回避するための一般的なルールはありますか?
editの実装を追加しました。DoStuff()
代わりにそれを呼び出してDoIt()
も問題ありません!
編集これにより、ユニットテストフレームワークまたはその他のコードが問題である可能性、またはconst参照によってキャッチされる可能性、またはruntime_errorが例外から派生したことを知らないコンパイラーの可能性を除外する必要があります。unittest マクロを拡張して実際に何をするかを示し、このソース ファイルだけを含む新しいプロジェクトを作成しました。
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;
}
}
出力はnot good
です。