2013-01-15 36 views

回答

3

這是一種糟糕的方法,您應該嘗試模擬您正試圖通過Mock ojects或其他機制來避免此狀態的邏輯部分。

現在你的問題你可以使用一個像isUnittest這樣的設置在測試設置和拆解上的類型變量,如果你喜歡,我不建議你這麼做。

+0

感謝您的線索,但事情是我想彈出一個警告只有單元測試用例運行,我不想在源代碼中添加任何布爾變量。我只想知道哪個目標運行有任何方法來檢查它? –

+0

不是你使用unittest的框架提供這樣一個標誌嗎? – CloudyMarble

+0

不,但我最終使用了布爾標誌,正如你所說的。謝謝 –

1

請勿直接發送信息UIAlertView。相反,使用依賴注入,例如財產一樣

@property (strong, nonatomic) Class alertViewClass; 

那麼你的代碼來創建一個警報可以做

UIAlertView *alert = [[_alertViewClass alloc] initWithTitle:…etc…]; 

在你的測試代碼,注入不同的類。我使用https://github.com/jonreid/JMRTestTools來指定JMRMockAlertView。然後,我可以使用JMRMockAlertViewVerifier來測試警報呼叫。 (實際上,這使得警報的測試驅動開發成爲可能。)

1

另一種方法是讓該類具有通過靜態方法控制的可自定義行爲,並讓測試用例在其靜態裝入方法中調用該方法。

我有一個類似的問題,使用故事板和外部寧靜的服務通過oauth進行身份驗證。應用程序委託會檢查appdelegate中是否存在有效的oauth標記:didFinishLaunchingWithOptions,如果沒有,則編程方式觸發segue執行oauth登錄。但這在測試案例中並不理想。爲了解決這個問題,我在應用代理中創建了一個靜態方法來禁用登錄屏幕。這是我的應用程序委託中的代碼:

static Boolean showLoginScreen = TRUE ; 

+ (void) disableLoginScreen 
{ 
    showLoginScreen = FALSE ; 
    NSLog(@"disabled login screen") ; 
} 

測試用例有其負載的方法來做到以下幾點:

// disable login screen for the test case 
+ (void) load { 
    NSLog(@"now disabling login screen") ; 
    [XYZAppDelegate disableLoginScreen]; 
} 

這工作,因爲申請被初始化之前測試用例類加載。當然,您必須在應用程序委託中檢查此標誌的值以觸發/不觸發登錄繼續。我嘗試但拒絕的其他替代方案如下:

1

這似乎爲我工作(的iOS 8時,Xcode 6):

- (BOOL) isRunningTest { 
    return NSClassFromString(@"XCTestCase") != nil; 
} 

我覺得這是比其他答案清潔和更容易。

+0

只有將所有測試用例寫入一個類名XCTestCase時,這纔是一個好主意。但是我意識到我要實現的目標是一個非常糟糕的主意!感謝您的努力... –

+1

確實,'XCTestCase'是iOS測試框架的一部分,因此無論如何它都可以工作(至少,如果您沒有在應用中導入框架,這並沒有多大意義)。 – manueGE

+1

作爲一個方面說明,即使對象不是'nil',將一個對象轉換爲'BOOL'也可以產生'NO'。 'BOOL'將使用指針的最後幾位,可以是這樣的:'00000000',它將被註冊爲'NO'。請參閱本文中的「投射到BOOL」:https://www.mikeash.com/pyblog/friday-qa-2012-12-14-objective-c-pitfalls.html – MaxGabriel

相關問題