6

ネイティブ ユニット テスト プロジェクトを使用して、Visual Studios 2012 でユニット テストを作成しようとしています。

これは私が持っているテストです:

TEST_METHOD(CalculationsRoundTests)
{
    int result = Calculations::Round(1.0);
    Assert::AreEqual(1, result);
}

クラスのエクスポート:

#ifdef EXPORT_TEST_FUNCTIONS
#define MY_CALCULATIONS_EXPORT __declspec(dllexport)
#else
#define MY_CALCULATIONS_EXPORT
#endif
...
class CALCULATIONS_EXPORT Calculations {
...
public:
static int Round(const double& x);

関数自体:

int Calculations::Round(const double& x)
{
    int temp;
    if (floor(x) + 0.5 > x)
        temp = floor(x);
    else
        temp = ceil(x);

    return int(temp);
}

ただし、ほとんどの場合、テストはエラー コード c0000005 (アクセス違反) で失敗します。テストは、x、または関数で宣言されている可能性のあるその他の変数が初めて使用されたときに失敗します。

Visual C++ 2012 の単体テストをコンパイルするときの未解決の外部の指示に従いました

4

2 に答える 2

1

これは既知のバグです。残念ながら、マイクロソフトはこれを「修正しない」と見なしています。

要するに、2 つの回避策があります。

  1. 実際のプロジェクトをリリース モードでコンパイルし、テスト プロジェクトをデバッグ モードでコンパイルします。
  2. テスト可能なすべての関数をスタティック ライブラリ プロジェクトにアウトソーシングします。
于 2015-05-14T13:07:03.000 に答える
0

テストの実行時にアクセス違反が発生する理由がわかりませんでした。ただし、何か間違った設定をしたと確信しています。

このエラーを取り除くために、Visual Studio ソリューションの構造を変更して、プログラムの実装を含むスタティック ライブラリ (.lib) プロジェクトにコードの大部分を配置しました。これにより、プロジェクト内のプログラムのすべてのクラスと関数が自動的にエクスポートされるため、__declspec(dllexport) を使用する必要がなくなります。

次に、.lib プロジェクトを参照するプログラム用の .exe ファイルを作成する小さな Win32 コンソール アプリケーションを作成しました。このプロジェクトの目的は、プログラムの実行可能ファイルを作成することなので、.lib プロジェクトでコードの開始を呼び出す main だけが必要でした。

これを行った後、.lib プロジェクトも参照するようにするだけで、Native Unit Test プロジェクトを簡単に動作させることができ、それ以来、アクセス エラーは発生していません。

于 2014-10-20T17:56:43.450 に答える