c++ - 在托管 C++ 测试中使用 TestContext.TestName

标签 c++ windows visual-studio managed-c++

如何在托管的 VS 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

最佳答案

一位同事为我回答了这个问题。如果您创建名为 TestInstance 的公共(public)成员属性,框架将自动为您设置测试上下文。这是适合我的确切语法。

#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()
    {

    }

};

关于c++ - 在托管 C++ 测试中使用 TestContext.TestName,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36090726/

相关文章:

c++ - 登录 cpp 14 和 17

c++ - 全局运算符 new 中的 std::ofstream

c# - 如何格式化运算符 C++ Visual Studio 之间的空间?

c++ - 从静态对象的内部类调用外部类虚函数

python - 如何让 python 加载混合模式 .dll 引用的 .NET .dll?

visual-studio - 如何将控件叠加到Visual Studio代码图面上

java - 无法在堆大小较大的 64 位 Windows 7 中运行 64 位 JVM

windows - 由于特殊的 Windows 文件夹名称 "aux",SVN 无法 checkout 应用程序

visual-studio - sdk 中的 flutter_localizations 依赖于 intl 0.17.0,fstore 依赖于 intl ^0.16.1,禁止来自 sdk 的 flutter_localizations

c++ - Visual Studio 项目属性中的增量字段