4

ここで 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です。

4

1 に答える 1