4

アプリケーションがnullptr固有のptrを返すかどうかをテストしたいと思います。私はいくつかのことを試しましたが、コンパイラーを通過するものは何もありません。誰かがすでにこの仕事をする方法を試し、見つけたことを願っています。私が試したいくつかのこと:

std::unique_ptr<SomeClass> some_class_ptr;

CPPUNIT_ASSERT_EQUAL(std::unique_ptr<SomeClass>(), some_class_ptr);

与える:libcppunit / include / cppunit / TestAssert.h | 49 |エラー:'ost <<x'|の'operator<<'に一致しません

TestAssert.hの内部:

template <class T>
void assertEquals( const T& expected,
                   const T& actual,
                   SourceLine sourceLine,
                   const std::string &message )
{
  if ( !assertion_traits<T>::equal(expected,actual) ) // lazy toString conversion...
  {
    Asserter::failNotEqual( assertion_traits<T>::toString(expected),
                            assertion_traits<T>::toString(actual),
                            sourceLine,
                            message );
  }
}

CPPUNIT_ASSERT_EQUAL(nullptr, some_class_ptr);

与える:/tests/SomeTestClass.cpp | 432 |エラー:'assertEquals(std :: nullptr_t、std :: unique_ptr&、CppUnit :: SourceLine、const char [1])'|を呼び出すための一致する関数がありません


CPPUNIT_ASSERT_EQUAL(nullptr, some_class_ptr.get());

与える:/tests/SomeTestClass.cpp | 432 |エラー:'assertEquals(std :: nullptr_t、std :: unique_ptr :: pointer、CppUnit :: SourceLine、const char [1])'|を呼び出すための一致する関数がありません


最初のものは正しいはずだと思いますが、コンパイルされていません。誰かが私にこれのための正しい構造を与えることができますか?

4

2 に答える 2

4

CPPUNIT_ASSERT_EQUAL引数がまったく同じ型である必要があります。nullptr引数 の表現を出力できる必要がないため、次のように使用できCPPUNIT_ASSERTます。

CPPUNIT_ASSERT(nullptr == some_class_ptr);

また

CPPUNIT_ASSERT(!some_class_ptr);
于 2012-09-24T12:25:36.207 に答える
3

問題は にあるようですがCPPUNIT_ASSERT_EQUAL、それを使用する正当な理由がわかりません。などがあるとCPPUNIT_ASSERT思います(ドキュメントまたはソースを確認してください)。次にCPPUNIT_ASSERT( some_class_ptr().get() == 0 )、 、またはポインターの null 性をチェックするために好みの式を書​​くだけです。

于 2012-09-24T12:19:21.087 に答える