模拟课程 - 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的主要内容,如果未能解决你的问题,请参考以下文章