我是 Objective-C 的初学者,但我用过一些 jUnit。
为了对我的代码进行单元测试,我需要能够模拟我通过 CFStreamCreatePairWithSocketToHost
函数使用的网络。
根据对 How to mock a C-function using OCMock 的回答,这在 OCMock 中是不可能的。是否有任何框架或技术允许这样做?
我宁愿不 promise 使用一些过于复杂的 Java 式 IoC 框架只是为了让我的代码更容易测试,但我必须说 Spring 的好处之一是当你使用所有东西时很少会出现这样的问题通过接口(interface)并通过依赖注入(inject)配置实现。这是前进的方向,还是有更简单的解决方案?
最佳答案
您可以在内存中重新绑定(bind)系统(所有)函数指针以进行测试。有多种技术可以做到这一点(例如 DYLD_INSERT_LIBRARIES),但最简单的方法是使用来自 Facebook 的便捷库: https://github.com/facebook/fishhook
#import "fishhook.h"
static void *(*orig_malloc)(size_t __size);
void *my_malloc(size_t size)
{
printf("Allocated: %zu\n", size);
return orig_malloc(size);
}
/* .. */
- (void)testMyTestCase
{
//hook malloc
rebind_symbols((struct rebinding[1]){{"malloc", my_malloc, (void *)&orig_malloc}}, 1);
char *a = malloc(100);
//restore original
rebind_symbols((struct rebinding[1]){{"malloc", orig_malloc, NULL}}, 1);
//...
}
关于objective-c - 在 Objective-C 中模拟 C 库函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23439238/