当我使用下面的过程运行单元测试时,一个简单的声明(如“CStringa;“。环境是Visual Studio 2019,语言是C++。
- Boot VisualStudio 2019
- 单击“创建新项目”
- 选择“MFC应用程序”,单击“下一步”
- 为“位置”项设置一个任意文件夹,然后使用其他默认值单击“创建”。
- 将所有设置保留为默认设置,然后单击“完成”。
- 将创建一个默认名称为“MFCApplication 1”的项目。
- 在“解决方案资源管理器”中右键单击“MFCApplication 1”项目,然后单击“属性”。在“配置属性”>“常规”>“常规属性”中,在“ C++ 标准”项中设置“ISO C17标准(/std:c17)”。
- 在“解决方案资源管理器”中右键单击“MFCApplication 1”项目,然后单击“属性”。在“配置属性”>“高级”>“高级属性”中,在“使用MFC”项中设置“在共享DLL中使用MFC”,并在“字符集”项中设置“使用多字节字符集”。增加。
- 将“SampleClass.cpp”和“SampleClass.h”添加到项目中。
SampleClass.h
#pragma once
class _DllExport SampleClass
{
public:
SampleClass(void);
virtual ~SampleClass(void);
char* sampleMethod();
protected:
private:
};
字符串
SampleClass.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 Test”,然后单击“Next”。
- 保留“Configure your new project”中的所有默认值,然后单击“Create”。
- 在“测试项目配置”中的“选择要测试的项目”处选择“MFCApplication 1”,然后单击“确定”,其他项目为默认值。
- 添加了一个名为“Sample-Test1”的新测试项目。
- 在“解决方案资源管理器”中右键单击“Sample-Test1”项目,然后单击“属性”。在“配置属性”>“常规”>“常规属性”中,在“ C++ 标准”项中设置“ISO C17标准(/std:c17)”。
- 在“解决方案资源管理器”中右键单击“Sample-Test1”项目,然后单击“属性”。在“配置属性”>“高级”>“高级属性”中,在“使用MFC”项中设置“在共享DLL中使用MFC”,并在“字符集”项中设置“使用多字节字符集”。增加。
- 在“解决方案资源管理器”中右键单击“Sample-Test1”项目,然后单击“属性”。将“$(ProjectDir)..\MFCApplication1\Debug\MFCApplication1.lib”添加到“Configuration Properties”>“Linker”>“Input”的“Additional Dependencies”项。
- 将以下代码添加到“Sample-Test1”项目。
test.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”项,然后单击“调试”以调试测试方法。
- 然后,在一个没有描述性的代码(如“CStringa;“。此外,在定义“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”
- 我尝试了以下版本。VS 2019专业版(v16.11、v16.7)和VS 2022。但是,没有一个版本解决了这个问题。我希望它能在VS 2019专业环境中工作。
- 我不仅尝试了Google Test,还尝试了一个原生单元测试项目,但它没有解决。
1条答案
按热度按时间1cosmwyk1#
来自doc:链接到对象或库文件
将输出的.obj或.lib文件添加到测试项目的依赖项中。
当你使用非库项目时,你应该链接到obj文件。然后删除
_DllExport
。对于MFC项目,您应该链接->input:GTest项目中的SampleClass.obj和PCH.obj。obj文件位于以下文件夹中:MFCApplication1\x64\Debug
个