9

いくつかのc++コードで単体テストを実行しようとしていますが、問題が発生しています。

次のコード行に似たものがあります...

std::string s1 = obj->getName();
std::string s2 = "ExpectedName";
Assert::AreEqual(s1, s2, "Unexpected Object Name");

そして、次のコンパイラエラーが発生します...

error C2665: 'Microsoft::VisualStudio::TestTools::UnitTesting::Assert::AreEqual' :
none of the 15 overloads could convert all the argument types

次のオーバーロードと一致するはずです:

AreEqual<(Of <(T>)>)(T, T, String) 

上記のオーバーロードは、引数1と2が同じタイプである限り、任意のオブジェクトをサポートする必要があるテンプレートオーバーロードではありませんか?それとも私は何かが足りないのですか?

このアサートを実行する他の方法はありますか?

4

4 に答える 4

4

ネイティブタイプでマネージドユニットテストフレームワークを使用しようとしています。これは、最初にオブジェクトをマネージドタイプにマーシャリングしないと機能しません。

VS2012には、ネイティブC++単体テストフレームワークが付属しています。代わりにこのフレームワークを使用すると、コードを"Unexpected Object Name"幅の広い文字列(プレフィックスに)に変更し、次のオーバーロードLを呼び出すことで機能する可能性があります。

template<typename T> 
static void AreEqual(
    const T& expected, 
    const T& actual, 
    const wchar_t* message = NULL, 
    const __LineInfo* pLineInfo = NULL)
于 2012-09-27T20:01:26.267 に答える
4

管理されていないC++にとどまろうとしていて、エラーメッセージがどのように表示されるかを気にしない場合、これはおそらく受け入れられた答えよりも優れたオプションです。

Assert::IsTrue(s1==s2)

より良いのは、少なくとも読みやすいということです。

于 2014-05-04T21:13:36.093 に答える
1

文字列の代わりに整数が比較されるように、少し回避策をハックしました。

Assert::AreEqual(0, s1.compare(s2), "Unexpected Object Name");

将来的には、ネイティブC ++単体テストに切り替える可能性がありますが、それまでの間、これでうまくいきます。明らかに、このためのメッセージはあまり役に立ちません

Assert.AreEqual failed. Expected:<0>. Actual:<1>. Unexpected Trajectory Name

しかし、それは何もないよりはましです。

于 2012-09-27T20:47:10.130 に答える
1

解決策は文字列の前にLプレフィックスを付けることだと思います

      Assert::AreEqual<bool>(true, dict->IsBeginWith("", ""), L"Empty");

このようにケースを試すこともできますが、これは間違った結果をもたらしますが、問題の理解の正しい方向につながります

   Assert::AreEqual<bool>(true, dict->IsBeginWith("", ""), (wchar_t*)"Empty"); //Empty
   Assert::AreEqual(true, dict->IsBeginWith("A", "A"), (wchar_t*)"Empty2");
   Assert::AreEqual(true, dict->IsBeginWith("A", "a"), (wchar_t*)""); //CAPITAL LETTER Check
于 2017-07-11T09:55:15.367 に答える