模拟课程 - iOS

Posted

技术标签:

【中文标题】模拟课程 - iOS【英文标题】:mocking a class - iOS 【发布时间】:2013-11-20 11:47:42 【问题描述】:

我是单元测试和 OCMock 的新手,所以这可能是一个显而易见的答案,只是在谷歌上没有找到答案。 我正在尝试测试模型对象的方法。 该方法代码如下:

 //takes a filepath and a pk, sets the filepath to the
BoxAppDelegate *delegate = [[UIApplication sharedApplication] delegate];
NSNumber *ifExistIndexInJson = [BoxJsonDataHelper pkExistInCurrentJson:[[[self.downloadQueue objectAtIndex:0] objectForKey:@"pk"] integerValue]];
if (ifExistIndexInJson)

    [[[self.downloadQueue objectAtIndex:0] objectForKey:@"fields"] setObject:path forKey:@"content"];
    NSError *error = nil;
    [[NSFileManager defaultManager] removeItemAtPath:[[[delegate.currentJsonData objectAtIndex:[ifExistIndexInJson integerValue]] objectForKey:@"fields"] objectForKey:@"content"] error:&error];
    [delegate.currentJsonData removeObjectAtIndex:[ifExistIndexInJson integerValue]];
    [delegate.currentJsonData addObject:[self.downloadQueue objectAtIndex:0]];
    [self.downloadQueue removeObjectAtIndex:0];
    if ([self.downloadQueue count] > 0)
    
    [BoxServerRequestsObject downloadFileForPK:[[[self.downloadQueue objectAtIndex:0] objectForKey:@"pk"] integerValue]sender:self];
    
    else
    
        //end the progress or whatever
    

else

    [[[self.downloadQueue objectAtIndex:0] objectForKey:@"fields"] setObject:path forKey:@"content"];
    [delegate.currentJsonData addObject:[self.downloadQueue objectAtIndex:0]];
    [self.downloadQueue removeObjectAtIndex:0];
    if ([self.downloadQueue count] > 0)
    
    [BoxServerRequestsObject downloadFileForPK:[[[self.downloadQueue objectAtIndex:0] objectForKey:@"pk"] integerValue]sender:self];
    
    else
    
        //end the progress or whatever
    


我需要一些帮助:

    当我调用 [BoxJsonDataHelper pkExistInCurrentJson:...] 时。 BoxJsonDataHelper其实是self,只是类方法不是实例,所以我叫它名字,如何伪造返回值的结果不依赖?

    如何在程序要删除的路径上伪造文件?而不是如何检查它是否已被删除?

    如何模拟 BoxServerRequestObject 以使方法调用模拟对象而不是真实对象?以及如何检查它是否已被调用(也是类方法)

我在单元测试方面的知识有限,我刚刚开始使用 OCMock 并阅读了一些示例,因此我希望得到完整的答案:)

【问题讨论】:

【参考方案1】:

    您可以像实例方法一样模拟类方法。他们一直被模拟,直到模拟被释放。

    id boxJsonDataHelperMock = [OCMockObject mockForClass:BoxJsonDataHelper.class]; [[[boxJsonDataHelperMock stub] andReturn:@(1)] pkExistInCurrentJson:OCMOCK_ANY]

    您是否只是在测试NSFileManager 在那个时候是否有效?对于数据对象,我更喜欢进行实际的写作。为什么不断言文件在删除后不存在?如果你想模拟,你应该模拟NSFileManager上的“defaultManager”并返回一个期望removeItemAtPath:error:的模拟对象

    在下载队列中的索引 0 处放置一个模拟对象。

【讨论】:

我在吹毛求疵,但他们一直被嘲笑,直到你调用 -stopMocking 或模拟被释放。如果您模拟框架类的方法(例如 NSURLConnection),则在完成测试后立即调用 stopMocking 非常重要。

以上是关于模拟课程 - iOS的主要内容,如果未能解决你的问题,请参考以下文章

L008之前课程实战模拟。

如何模拟 Laravel 模型以进行课程测试?

王悦宇:杭州九阳电器《360度营销管理沙盘模拟》课程

python模拟选课系统

天野易语言模拟班第二期课程

王悦宇:美的集团小天鹅洗衣机《企业经营管理沙盘模拟》课程