9

ビュー モデルで 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;
}

createSubmitCommand は、ビュー モデルを初期化すると呼び出され、validSignal はテスト コンテキストで有効です。

Core Data の永続化には 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];

問題は、保存が非同期でブロックされず、テストが終了して NSManagedObjectContext が破棄され、テストが失敗することです。自分がしようとしているテストが完全に間違っているか、RACCommand を誤用しているように感じますが、どちらが正しいかわかりません...

4

1 に答える 1

6

これは私が愚かだったことが判明しました。このテストに対する私の期待は次のとおりです。

[[expectFutureValue(models) shouldEventually] haveCountOf: 2];

キウイはくっついて結果待ちのようです。

于 2013-06-16T15:27:57.730 に答える