2016-03-18 9 views
1

管理対象のVS C++テストコードでTestContextクラスのTestNameメンバを使用して、テストメソッドの名前をデバッグコンソールに自動的に出力するにはどうすればよいですか?Managed C++テストでTestContext.TestNameを使用

私が見つけたすべての例はC#であり、それをC++に正しく変換することはできません。ここでは、静的なClassInitializeメソッド中にTestContextオブジェクトをキャプチャすることでこれを試みますが、これは機能しません。

#include <windows.h> 
#include <msclr/marshal_cppstd.h> 

using namespace Microsoft::VisualStudio::TestTools::UnitTesting; 

[TestClass] 
public ref class SampleTestClass 
{ 

public: 

    [TestMethod] 
    void testMethod1() 
    { 

    } 

    [TestMethod] 
    void testMethod2() 
    { 

    } 

    [TestMethod] 
    void testMethod3() 
    { 

    } 

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
// Tests Setup and Teardown                     // 
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 

    static TestContext^ myTestContext; 

    [TestInitialize] 
    void testCaseInitialize() 
    { 
     msclr::interop::marshal_context context; 
     std::wstring testName = context.marshal_as<std::wstring>(myTestContext->TestName); 
     std::wstring dbgSend = L"initializing " + testName; 
     ::OutputDebugString(dbgSend.c_str()); 
    } 

    [TestCleanup] 
    void testCaseCleanup() 
    { 
     msclr::interop::marshal_context context; 
     std::wstring testName = context.marshal_as<std::wstring>(myTestContext->TestName); 
     std::wstring dbgSend = L"tearing down " + testName; 
     ::OutputDebugString(dbgSend.c_str()); 
    } 

    [ClassInitialize] 
    static void testClassInitialize(TestContext^ context) 
    { 
     myTestContext = context; 
    } 

    [ClassCleanup] 
    static void testClassCleanup() 
    { 

    } 



}; 

出力

[9404] initializing testMethod1 
[9404] tearing down testMethod1 
[9404] initializing testMethod1 
[9404] tearing down testMethod1 
[9404] initializing testMethod1 
[9404] tearing down testMethod1 

所望の出力

[9404] initializing testMethod1 
[9404] tearing down testMethod1 
[9404] initializing testMethod2 
[9404] tearing down testMethod2 
[9404] initializing testMethod3 
[9404] tearing down testMethod3 

答えて

0

同僚は私のために質問に答えました。 TestInstanceという名前のパブリックメンバープロパティを作成した場合、フレームワークは自動的にテストコンテキストを設定します。ここで私のために働く正確な構文です。

#include <windows.h> 
#include <msclr/marshal_cppstd.h> 

using namespace Microsoft::VisualStudio::TestTools::UnitTesting; 

[TestClass] 
public ref class SampleTestClass 
{ 

public: 

    [TestMethod] 
    void testMethod1() 
    { 

    } 

    [TestMethod] 
    void testMethod2() 
    { 

    } 

    [TestMethod] 
    void testMethod3() 
    { 

    } 

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
// Tests Setup and Teardown                     // 
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 

    private: 
    TestContext^ myTestContextInstance; 

    public: 
    property TestContext^ TestContext 
    { 

     virtual Microsoft::VisualStudio::TestTools::UnitTesting::TestContext^ get() 
     { 
      return myTestContextInstance; 
     } 

     virtual void set(Microsoft::VisualStudio::TestTools::UnitTesting::TestContext^ value) 
     { 
      myTestContextInstance = value; 
     } 
    } 


    [TestInitialize] 
    void testCaseInitialize() 
    { 
     msclr::interop::marshal_context context; 
     std::wstring testName = context.marshal_as<std::wstring>(myTestContextInstance->TestName); 
     std::wstring dbgSend = L"initializing " + testName; 
     ::OutputDebugString(dbgSend.c_str()); 
    } 

    [TestCleanup] 
    void testCaseCleanup() 
    { 
     msclr::interop::marshal_context context; 
     std::wstring testName = context.marshal_as<std::wstring>(myTestContextInstance->TestName); 
     std::wstring dbgSend = L"tearing down " + testName; 
     ::OutputDebugString(dbgSend.c_str()); 
    } 

    [ClassInitialize] 
    static void testClassInitialize(Microsoft::VisualStudio::TestTools::UnitTesting::TestContext^ context) 
    { 

    } 

    [ClassCleanup] 
    static void testClassCleanup() 
    { 

    } 

};