我正在尝试使用UIImagePNGRepresentation来模拟OCMock。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以前有人嘲笑过这个功能吗?任何帮助都将不胜感激,谢谢。
发布于 2016-02-27 00:03:14
你说得对,普通的函数不能那样被嘲弄。
像OCMock和OCMockito这样的模拟库为存根和验证方法调用提供了一种方法。UIImagePNGRepresentation不是一个方法,它是一个独立的C函数。
那么,您如何替换它进行测试呢?不要直接调用它,而是通过函数指针调用它。为了正常使用,请将UIImagePNGRepresentation分配给指针。为了进行测试,请分配您定义的函数。
发布于 2020-12-15 05:37:16
模仿类似于此的C函数可以很容易地使用Facebook库鱼钩来实现。https://github.com/facebook/fishhook
在测试文件中编写一个备用方法:
NSData * __nullable swizzled_UIImagePNGRepresentation(UIImage * __nonnull image)
{
return [NSData data];
}然后从测试函数中重新绑定符号,以便调用我们的方法而不是原来的方法。有点像摇摆法。
-(void)testAlbumArt
{
rebind_symbols((struct rebinding[1]){{"UIImagePNGRepresentation", swizzled_UIImagePNGRepresentation}}, 1);
....continue and expect [NSData data] when you call UIImagePNGRepresentation...
}https://stackoverflow.com/questions/35661769
复制相似问题