使用GoogleTest运行测试时,简单的变量定义会发生SEH异常

问题描述 投票:0回答:1

当我使用以下过程运行单元测试时,诸如“CString a;”之类的简单声明发生了异常。 环境是Visual Studio 2019,语言是C++。

  • 启动VisualStudio2019
  • 点击“创建新项目”
  • 选择“MFC App”,点击“下一步”
  • 为“位置”项设置任意文件夹,然后单击“创建”,其他默认即可。
  • 将所有内容保留为默认值,然后单击“完成”。
  • 将创建一个默认名称为“MFCApplication1”的项目。
  • 在“解决方案资源管理器”中右键单击“MFCApplication1”项目,然后单击“属性”。在“配置属性”>“常规”>“常规属性”中,设置“ISO C++17 Standard(/std:c++ 17)”在“C++语言标准”项中。
  • 在“解决方案资源管理器”中右键单击“MFCApplication1”项目,单击“属性”。在“配置属性”>“高级”>“高级属性”中,在“MFC的使用”中设置“在共享DLL中使用MFC”项并在“字符集”项中设置“使用多字节字符集”。增加。
  • 将“SampleClass.cpp”和“SampleClass.h”添加到您的项目中。

SampleClass.h

#pragma once


class _DllExport SampleClass
{
public:
    SampleClass(void);
    virtual ~SampleClass(void);
    char*   sampleMethod();
protected:
private:
};

示例类.cpp

#include "pch.h"
#include <string.h>

#include "SampleClass.h"


SampleClass::SampleClass(void) {
}

SampleClass::~SampleClass(void) {
}

char*   SampleClass::sampleMethod() {
    CString a;
    return "test";
}
  • 将代码添加到pch.h
#define _DllExport   __declspec( dllexport )
  • 构建项目并确保其完成且没有错误。
  • 右键单击“解决方案资源管理器”中的解决方案,然后单击“添加”>“新建项目...”
  • 选择“Google 测试”并单击“下一步”。
  • 保留“配置新项目”中的所有默认值,然后单击“创建”。
  • “测试项目配置”中的“选择要测试的项目”处选择“MFCApplication1”,点击“确定”,其他项默认即可。
  • 添加了一个名为“Sample-Test1”的新测试项目。
  • 在“解决方案资源管理器”中右键单击“Sample-Test1”项目,然后单击“属性”。在“配置属性”>“常规”>“常规属性”中,设置“ISO C++17 Standard(/std:c ++17)”在“C++语言标准”项中。
  • 在“解决方案资源管理器”中右键单击“Sample-Test1”项目,单击“属性”。在“配置属性”>“高级”>“高级属性”中,在“使用共享DLL”中设置“在共享DLL中使用MFC” MFC”项并在“字符集”项中设置“使用多字节字符集”。增加。
  • 右键单击“解决方案资源管理器”中的“Sample-Test1”项目,然后单击“属性”。将“$(ProjectDir)..\MFCApplication1\Debug\MFCApplication1.lib”添加到“配置属性”>“链接器”>“输入”的“其他依赖项”项中。
  • 将以下代码添加到“Sample-Test1”项目中。

测试.cpp

#include "pch.h"
#include "..\MFCApplication1\SampleClass.h"

TEST(TestCaseName, TestSampleMethod) {
    SampleClass sampleClass;
    char* value = sampleClass.sampleMethod();
    EXPECT_TRUE(strcmp(value, "test") == 0);
}
  • 将代码添加到“Sample-Test1”项目的 pch.h 中
#define _DllExport   __declspec( dllimport )
  • 运行构建并确保其完成且没有错误。
  • 右键单击“测试资源管理器”中显示的“TestName”项,然后单击“调试”来调试测试方法。
  • 然后,您会在像“CString a;”这样的不起眼的代码中遇到 SEH 异常。 另外,定义“std::vector”等变量以及处理“memset”、“printf”等处理时,运行时也会出现异常。
Exception thrown at 0x80000142 in Sample-Test1.exe: 0xC0000005: Access violation executing location 0x80000142.

unknown file: error: SEH exception with code 0xc0000005 thrown in the test body.

使用几乎默认设置创建的项目无法通过简单的测试。我还需要配置其他东西吗? 最终我想用下面的代码毫无问题地完成测试。 所有这些在运行单元测试时都会引发异常。

  • 将“CString”或“std::vector”等变量添加到成员变量中

  • 对“CString”或“std::vector”等变量使用局部变量

  • 使用标准库函数,例如“memset”和“vsprintf_s”

  • 我尝试了以下版本。 VS2019 专业版(v16.11、v16.7)和 VS2022。 但是,所有版本都没有解决该问题。 希望能在VS2019 Professional环境下运行。

  • 我不仅尝试了Google Test,还尝试了本机单元测试项目,但没有解决。

c++ visual-studio unit-testing mfc
1个回答
0
投票

从 MFC 库模板项目而不是 MFC 应用程序创建 MFC DLL。

MFClibrary1.h

#include "resource.h"       // main symbols

class __declspec(dllexport) SampleClass
{
public:
    SampleClass(void);
    virtual ~SampleClass(void);
    char* sampleMethod();
protected:
private:
};

MFClibrary1.cpp

#include "pch.h"
#include "framework.h"
#include "MFCLibrary1.h"



SampleClass::SampleClass(void) {
}

SampleClass::~SampleClass(void) {
}

char* SampleClass::sampleMethod() {
    CString a;
    return "test";
}

© www.soinside.com 2019 - 2024. All rights reserved.