调用时XCTest失败

我有一些代码,在某些时候调用[NSBundle mainBundle] ,主要是读取/设置首选项。 当我unit testing的方法,testing失败,因为testing的mainBundle不包含该文件。

这是一个已知的问题 ,苹果不会因为他们认为它不是一个bug而修复 :

他们答复的要点是XCTest通过返回它自己的主包而不是testing目标包来正常工作。

以前我们的代码是在NSBundle+mainBundle类方法上使用类别重写来解决这个问题。 但是这是很危险的,因为覆盖类别中现有方法的行为是未定义的 。

如果在类别中声明的方法的名称与原始类中的方法相同,或者在同一个类(甚至是超类)上的另一个类中的方法相同,则行为是不确定的运行。

实际上Xcode提醒你:

类正在实现一个方法,也将由其主要类实现

那么,解决这个问题的正确方法是什么呢?

解决这个问题的最简单最简单的方法是在你调用[NSBundle mainBundle]时候,在你的unit testing中部分地模拟NSBundle类来返回[NSBundle bundleForClass:[self class]] [NSBundle mainBundle]

你可以把它放在你的-setup方法中,这样它就可以模拟你的整个testing类:

 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 

好,干净。

[ 来源 ]