OCmock 和 MKReverseGeocoder
Posted
技术标签:
【中文标题】OCmock 和 MKReverseGeocoder【英文标题】:OCmock and MKReverseGeocoder 【发布时间】:2010-05-04 15:34:00 【问题描述】:我想测试一种使用反向地理编码的方法。我想做的是:
将地理编码器设置为我的控制器的属性
在init方法中创建地理编码器
在我要测试的方法中调用地理编码器
在我的测试中用模拟替换地理编码器
问题是MKReverseGeocoder坐标属性是只读的,我只能在构造方法中设置:
[[MKReverseGeocoder alloc] initWithCoordinate:coord]
当然,坐标仅在我想测试的方法中可用..
有谁知道我如何模拟 MKReverseGeocoder 类?
提前致谢, 文森特。
【问题讨论】:
【参考方案1】:查看Matt Gallagher's great article on unit testing Cocoa applications。他为 NSObject 提供了一个类别扩展,允许您在测试时替换实例。我用它来做类似的事情。我认为您的测试看起来像这样:
#import "NSObject+SupersequentImplementation.h"
id mockGeocoder = nil;
@implementation MKReverseGeocoder (UnitTests)
- (id)initWithCoordinate:(CLLocationCoordinate2D)coordinate
if (mockGeocoder)
// make sure the mock returns the coordinate passed in
[[[mockGeocoder stub] andReturn:coordinate] coordinate];
return mockGeocoder;
return invokeSupersequent(coordinate);
@end
...
-(void) testSomething
mockGeocoder = [OCMockObject mockForClass:[MKReverseGeocoder class]];
[[mockGeocoder expect] start];
// code under test
[myObject geocodeSomething];
[mockGeocoder verify];
// clean up
mockGeocoder = nil;
【讨论】:
以上是关于OCmock 和 MKReverseGeocoder的主要内容,如果未能解决你的问题,请参考以下文章
用于本地实例化和作用域变量的 OCUnit 或 OCmock 测试方法。
OCMock 3 Partial Mock:类方法和 objc 运行时
xcode 中的单元测试(使用 GHUnit 和 OCMock)