2013-12-12 51 views
1

我試圖使用ReactiveCocoa和Kiwi進行測試,並使用CocoaPods進行依賴管理。將ReactiveCocoa,Kiwi和Cocoapods一起使用,得到「不是元組」異常

我有一個典型的登錄屏幕設置的第一個測試,其中登錄按鈕沒有啓用,直到用戶輸入用戶名和密碼的東西。只是一個簡單的一些示例代碼版本:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    RAC(self.loginButton, enabled) = [RACSignal combineLatest:@[self.userNameField.rac_textSignal, 
                  self.passwordField.rac_textSignal] 
                 reduce:^(NSString *username, NSString *password) { 
     return @(username.length > 0 && password.length > 0); 
    }]; 
} 

的問題是,當我運行測試中,我得到以下錯誤:

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Value from stream <RACDynamicSignal: 0xe3735a0> name: +combineLatest: (
    "<RACDynamicSignal: 0xe368c50> name: <UITextField: 0xe3707a0> -rac_textSignal", 
    "<RACDynamicSignal: 0xe372d80> name: <UITextField: 0xe36aef0> -rac_textSignal" 
) is not a tuple: <RACTuple: 0xe377a40> (
    "", 
    "" 
)' 

當然,這是一個RACTuple,所以這只是令人困惑。

我的研究打開了下面的問題上ReactiveCocoa:

https://github.com/ReactiveCocoa/ReactiveCocoa/issues/901

診斷有是ReactiveCocoa是獲得鏈接莫名其妙地兩次。有問題的人通過拋棄CocoaPods解決了問題。這看起來不正確。有沒有人得到這個工作?

爲了完整起見,我Podfile是:

platform :ios, '6.0' 

pod 'ReactiveCocoa' 

target :test do 
    link_with 'PollVaultTests' 
    pod 'Kiwi/XCTest' 
end 

回答

4

好了,我可以回答我的問題。

事實證明,當您在Podfile的「全局」級別上列出豆莢時,CocoaPods將它們包括在所有目標中。

在這種情況下的結果是我的主項目鏈接在CocoaPods中 - 我的測試目標也是如此。

當我的測試目標被注入到我的主項目中來運行測試時 - 您會將ReactiveCocoa鏈接兩次。因此,有兩個名爲RACTuple的類可以浮動 - 因此,當ReactiveCocoa代碼在內部檢查以確保其參數爲RACTuple時,它會檢查該類的錯誤副本並有效地產生錯誤的否定結果。

解決的辦法是確保在Podfile我的測試目標被配置爲像這樣只測試莢鏈接:

platform :ios, '6.0' 

pod 'ReactiveCocoa' 

target :test, :exclusive => true do 
    link_with 'PollVaultTests' 
    pod 'Kiwi/XCTest' 
end 

:exclusive => true部分就是講述的CocoaPods僅包括獼猴桃測試框架在我的測試目標中。問題解決了!

+0

一個潛在的問題:你需要重新運行'pod install'才能工作。 – eremzeit

相關問題