我在对我的程序进行单元测试时遇到了问题。问题很简单,但我不确定为什么这不起作用。
1 -> 我构建了我的所有程序
2 -> 我构建了我的 unitTest
3 -> 测试正在运行。
当它不是从数据段获取全局数据时,一切都很好。似乎该变量未初始化/或未找到。所以当然我所有的测试都错了。
我的问题是:构建一个可执行文件,然后在上面运行测试是完全错误的吗?还是我必须同时编译所有代码+单元测试,然后运行它?还是只是缺少 SenTesting 框架?
我忘了提到这是一个 C++ const 字符串。不知道这是否会改变一些东西。
*编辑***
我的假设是错误的,但我仍然不明白超越的魔力!似乎是一个 C++ 魔法 hoydi hoo?
char cstring[] = "***";
std::string cppString = "***";
NSString* nstring = @"***";
- (void)testSync{
STAssertNotNil(nstring, nil); // fine
STAssertNotNil((id)strlen(bbb), nil); // fine
STAssertNotNil((id)cppString.size(), nil); // failed
}
编辑 2 **
实际上,这部分代码没有初始化 C++ 是正常的。如果我对我的可执行文件执行 nm,我的 C 和 Obj-C 全局似乎被放入了 dataSegment。我以为我的 C++ 字符串是同样的情况,但它实际上被放入了 bss 段。这意味着它未初始化。事实是 C++ 编译器做了一些魔术,并且 C++ 字符串在 main() 调用之后被初始化,并且就像它进入 dataSegment 一样。
我不知道 testSuit 没有 main() 调用,所以 C++ 对象永远不会被初始化。有一些技术可以在 testSuit 之前调用 .ctor。但我懒得解释,这是某种话题。我刚刚用一个简单的 char 数组替换了我的 C++ 字符串,它工作得很好,因为我的值现在是 POD。
顺便说一句,如果它们只是只读的,那么全局变量中就没有魔鬼。;)