簡體   English   中英

調用[NSBundle mainBundle]時XCTest失敗

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM