我有一些代码可以调用[NSBundle mainBundle]
在某些时候,主要是为了读取/设置首选项。当我对该方法进行单元测试时,测试失败,因为测试的 mainBundle 不包含该文件。
This is 一个已知问题,苹果不会像他们认为的那样修复不是一个错误:
他们回复的要点是,XCTest 通过返回它自己的主包而不是测试目标的包来正常工作。
以前我们的代码库使用了类别覆盖NSBundle
's +mainBundle
类方法来解决这个问题。但这是危险的,因为覆盖类别中现有方法的行为是未定义的.
如果类别中声明的方法的名称与原始类中的方法相同,或者与同一类(甚至超类)的另一个类别中的方法相同,则该行为未定义使用哪个方法实现运行。
实际上 Xcode 会警告你:
类别正在实现一个方法,该方法也将由其主类实现
那么,解决这个问题的正确方法是什么?
解决此问题的最简单、最干净的方法是在单元测试中部分模拟 NSBundle 类以返回[NSBundle bundleForClass:[self class]]
你打电话时[NSBundle mainBundle]
.
您可以将其放入您的-setup
方法,以便为整个测试类模拟它:
static id _mockNSBundle;
@implementation MyTests
- (void)setUp
{
[super setUp];
_mockNSBundle = [OCMockObject niceMockForClass:[NSBundle class]];
NSBundle *correctMainBundle = [NSBundle bundleForClass:self.class];
[[[[_mockNSBundle stub] classMethod] andReturn:correctMainBundle] mainBundle];
}
@end
漂亮又干净。
[Source]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)