使用 OCMockito 模拟 UIImage 进行单元测试

Unit testing with OCMockito mocking UIImage

所以我正尝试以一种更加测试驱动的方式开始开发,学习使用测试等,因此我已经遇到了一个令人烦恼的问题。

我想测试一个函数,我将一个 NSArray 传递给然后将一个暴露的 UIScrollview 子视图第三个索引(前两个默认为滚动插入)设置为一个包含有效图像的 UIImageView。

我传入的数组将是 ALAsset 类型,该方法将提取图像。但是我还没到那一步。

所以我的第一个问题是......我可以模拟一个 UIImage 是有效的,即在这种情况下不是 nil 吗?还是应该以不同的方式处理我编写测试的方法?

到目前为止,这是我尝试过的方法

UIImage *mockImage = mock([UIImage class]);
UIImageView *imgView = [[UIImageView alloc]init];

[imgView setImage:mockImage];
NSArray *assets = @[imgView];
[SUT loadImagesForAssets:assets];

NSInteger firstViewIndexOddset = 2;
NSInteger idx = 0;

idx += firstViewIndexOddset;

UIImageView *imgViewFromSUT = [[SUT previewScrollView] subviews][idx];

XCTAssertNotNil(imgViewFromSUT.image);

不要被模拟对象框架所诱惑,即使是 OCMockito。当您第一次开始测试时,我建议 不要 使用任何模拟框架。相反,自己做。在厌倦了一遍又一遍地输入类似的东西之后,看看模拟对象框架是否会有所帮助。

当我想要一个使用有效 UIImage 的测试时,我使用这个:

@implementation TestingImageData

+ (NSData *)validImageData
{
    const char PNGbytes[] = "\x89\x50\x4E\x47\x0D\x0A\x1A\x0A\x00\x00\x00\x0D\x49\x48\x44\x52\x00"
        "\x00\x00\x01\x00\x00\x00\x01\x01\x03\x00\x00\x00\x25\xDB\x56\xCA\x00\x00\x00\x03\x50\x4C"
        "\x54\x45\x00\x00\x00\xA7\x7A\x3D\xDA\x00\x00\x00\x01\x74\x52\x4E\x53\x00\x40\xE6\xD8\x66"
        "\x00\x00\x00\x0A\x49\x44\x41\x54\x08\xD7\x63\x60\x00\x00\x00\x02\x00\x01\xE2\x21\xBC\x33"
        "\x00\x00\x00\x00\x49\x45\x4E\x44\xAE\x42\x60\x82"; // 1x1 transparent pixel PNG
    size_t PNGlength = sizeof(PNGbytes) - 1;
    return [NSData dataWithBytes:PNGbytes length:PNGlength];
}

@end

例如:

[UIImage imageWithData:[TestingImageData validImageData]]