我的应用程序使用第三方C API 来完成某些任务。我想知道如何对调用 API 的类进行单元测试,因为设置单元测试环境以使其正常工作是不切实际的。
一个例子。我的一个类可能有这样的方法:
- (id) doSomeStuff
{
// my code
// ...
thirdPartyDoStuffFunction(17, 4);
// etc...
}
对应的单元测试:
- (void) testDoSomeStuff
{
MyClass *x = [[MyClass alloc] init];
id result = [x doSomeStuff];
STAssertNotNil(result, @"Result mustn't be nil");
}
假设由于我无法控制的原因,thirdPartyDoStuffFunction
在运行单元测试目标时调用会使测试崩溃。出于这个原因,并且因为我想确保使用正确的参数调用了该函数,所以我想模拟它。
这是我到目前为止所尝试的:
- 定义将第三方函数重定向到它们的模拟版本的预处理器宏。但是,到目前为止,我无法完成这项工作。首先,我尝试
UNIT_TEST
在单元测试目标的配置中定义一个预处理器常量,但该常量只对我的单元测试类有影响,对我正在测试的类没有影响。 - 然后我发现this thread about created a prefix header for the test target,这似乎与第一种方法的效果完全相同:
UNIT_TEST
前缀头中定义的常量仅在测试类中可见,而不是在测试类中可见。
更新:以上两种方法现在都对我有用。他们没有的原因似乎是.m
被测类的实现文件()没有被添加到单元测试目标中。一旦我添加了它们,宏就会按预期执行,即它们会覆盖第三方 API。
我仍然想知道为什么没有编译器/链接器错误,并且单元测试实际上运行了,而某些实现不存在于他们的目标中,但重要的是它现在可以工作。