嘲笑UIImagePNGRepresentation

时间:2016-02-26 21:08:05

标签: ios objective-c unit-testing uiimage ocmock

我正在尝试使用OCMock模拟UIImagePNGRepresentation。 UIImagePNGRepresentation接受UIImage并返回NSData。

但似乎你不能把它模仿为普通的功能。

我尝试的是以下内容,但它没有编译。

id mockAlbumArt = [OCMockObject niceMockForClass:[UIImage class]];
id mockImageData = [OCMockObject niceMockForClass:[NSData class]];

id uiimageMock = [OCMockObject niceMockForClass:[UIImage class]];
[[[uiimageMock expect] andReturn:mockImageData] UIImagePNGRepresentation:mockAlbumArt];

如果查看UIImage的标题,UIImagePNGRepresentation定义为:

UIKIT_EXTERN  NSData * __nullable UIImagePNGRepresentation(UIImage * __nonnull image);                               // return image as PNG. May return nil if image has no CGImageRef or invalid bitmap format

之前有没有人做过嘲笑这个功能?任何帮助将不胜感激,谢谢。

2 个答案:

答案 0 :(得分:0)

你是对的,普通的功能不能这样嘲笑。

模拟OCMock和OCMockito之类的库提供了一种存根和验证方法调用的方法。 UIImagePNGRepresentation不是一种方法,它是一个独立的C函数。

那么如何替换它进行测试呢?不要直接调用它,而是通过函数指针调用它。正常使用时,将UIImagePNGRepresentation指定给指针。要进行测试,请指定您定义的功能。

答案 1 :(得分:0)

使用Facebook库鱼钩可以轻松实现类似于C的模拟C函数。 https://github.com/facebook/fishhook

在测试文件中写一个替代方法:

my_dict = {
    "Value1": "2000",
    "Value2": "3000",
    "Value3": "4000"
}

for key in my_dict:
    value = my_dict[key]
    if int(value) > 2000:
        print(key, value)

,然后从测试函数中重新绑定符号,以便调用我们的方法而不是原始方法。一种类似的方法。

NSData * __nullable swizzled_UIImagePNGRepresentation(UIImage * __nonnull image)
{
    return [NSData data];
}