在View Model上测试RACCommand

JFo*_*kes 9 asynchronous mvvm magicalrecord reactive-cocoa

我正在尝试测试在我的视图模型上执行的RACCommand的结果.

我这样设置我的提交命令:

- (void) createSubmitCommand
{
    @weakify(self);
    self.submitCommand = [RACCommand commandWithCanExecuteSignal: [self validSignal]];
    self.submitSignal = [self.submitCommand
                           addSignalBlock:^RACSignal *(id value) {
                               @strongify(self);
                               return [self save];
                           }];
}

- (RACSignal *) save
{
    RACSubject *saveSubject = [RACSubject subject];

    [self.model.managedObjectContext MR_saveOnlySelfWithCompletion:^(BOOL success, NSError *error) {
        if (!success)
        {
            [saveSubject sendError: error];
        }
        else
        {
            [saveSubject sendNext: nil];
            [saveSubject sendCompleted];
        }
    }];

    return saveSubject;
}
Run Code Online (Sandbox Code Playgroud)

当我初始化我的视图模型并且validSignal在测试上下文中有效时,将调用createSubmitCommand.

我正在使用MagicalRecord进行核心数据持久性测试和Kiwi测试.当我调用我的模型保存的[[viewModel submitCommand] execute:nil]时,我需要测试一下.

我的测试看起来像这样:

__block NSArray *models = nil;
[[vm submitSignal] subscribeNext:^(id x) {
    models = [Model MR_findAll];
}];

[[vm submitCommand] execute: nil];

[[expectFutureValue(models) should] haveCountOf: 2];
Run Code Online (Sandbox Code Playgroud)

问题是save是异步的,并且不阻塞然后测试结束并拆除我的NSManagedObjectContext并且测试失败.我觉得我的测试完全错误,我正在尝试做什么,或者我在滥用RACCommand,但我不知道哪个......

JFo*_*kes 6

结果证明这是我的愚蠢.我对此测试的期望应该是:

[[expectFutureValue(models) shouldEventually] haveCountOf: 2];
Run Code Online (Sandbox Code Playgroud)

猕猴桃似乎坚持不懈,现在等待结果.