1

我正在尝试使用 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

1 回答 1

4

好吧,我来回答我自己的问题。

事实证明,当 pod 在您的“全局”级别列出时Podfile,CocoaPods 会将它们包含在所有目标中。

在这种情况下,结果是我的主要项目链接在 CocoaPods 中——我的测试目标也是如此。

当我的测试目标被注入到我的主项目中以运行测试时 - 你会得到 ReactiveCocoa 链接两次。所以有两个名为RACTuple浮动的类 - 所以当 ReactiveCocoa 代码内部检查以确保其参数是 aRACTuple时,它会检查该类的错误副本并有效地产生假阴性结果。

解决方案是确保我的测试目标Podfile配置为链接测试 pod,如下所示:

platform :ios, '6.0'

pod 'ReactiveCocoa'

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

:exclusive => true部分告诉 Cocoapods 在我的测试目标中只包含 Kiwi 测试框架。问题解决了!

于 2013-12-12T17:34:10.253 回答