objective-c - 在 Objective-C 中模拟 C 库函数

标签 objective-c unit-testing ocmock

我是 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/

相关文章:

iphone - OCUnit 可以依赖后台线程中的代码吗? (为了测试异步请求)

android - 基于时间服务器的验证码的安全性

python - 使用 patch 初始化参数并使用 urllib2 进行模拟

java - 向 Gradle 添加额外的测试套件

ios - OCMock 在 NSMutableAttributedString 上模拟 'initWithAttributedString' 失败

ios - 如何模拟以 pmkpromise 作为返回类型的方法

ios - 为 UILabel 增加触摸手势区域

ios - 从 UIViewController 呈现 UINavigationController 没有默认的取消按钮

ios - 如何部分模拟外部对象

ios - 如何在 iOS 中设计类似 UITabBarItem 的 UIButton?