[英]XCTest fails when calling [NSBundle mainBundle]
我有一些代碼在某些時候調用[NSBundle mainBundle]
,主要是讀取/設置首選項。 當我對方法進行單元測試時,測試失敗,因為測試的mainBundle不包含該文件。
這是一個眾所周知的問題 ,Apple不會修復,因為他們認為這不是一個bug :
他們回復的要點是XCTest通過返回它自己的主bundle而不是測試目標的bundle來正常工作。
以前我們的代碼庫在NSBundle
的+mainBundle
類方法上使用類別覆蓋來解決這個問題。 但這很危險,因為覆蓋類別中現有方法的行為是未定義的 。
如果在類別中聲明的方法的名稱與原始類中的方法相同,或者在同一個類(或甚至是超類)上的另一個類別中的方法相同,則關於在哪個方法實現中使用哪個方法實現的行為是未定義的。運行。
實際上Xcode警告你:
類別正在實施一種方法,該方法也將由其主要類實現
那么,解決這個問題的正確方法是什么?
解決此問題的最簡單和最[NSBundle bundleForClass:[self class]]
在您調用[NSBundle mainBundle]
時,在單元測試中部分模擬NSBundle類以返回[NSBundle bundleForClass:[self class]]
[NSBundle mainBundle]
。
您可以將它放在-setup
方法中,以便為整個測試類進行-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
干凈整潔。
[ 來源 ]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.