(я могу использовать это в совершенно неправильном порядке, так что не стесняйтесь, чтобы бросить вызов помещения этого поста.)Unit-тестирование простого использования RACSignal с RACSubject
У меня есть небольшой RACTest app (sound familiar?), что Я пытаюсь выполнить тестирование. Я бы хотел протестировать MPSTicker, один из самых активных компонентов ReactiveCocoa. Он имеет сигнал, который отправляет значение один раз в секунду, которое накапливается, если флаг накопления установлен в YES. I added an initializer, чтобы принять пользовательский сигнал для его возрастающего сигнала, а не только на основе таймера.
Я хотел модульное тестирование пары поведения MPSTicker:
- Убедитесь, что его приращение накопления сигнала надлежащим образом (т.е. монотонно возрастает), когда накопление включено и входной сигнал приращения посылает новое значение.
- Убедитесь, что он отправляет то же значение (а не приращение), когда входной сигнал отправляет значение.
Я добавил a test that uses the built-in timer to test the first increment, и она работает, как я ожидал (хотя я ищу рекомендации по улучшению кретиничной инициализации RACSequence я сделал, чтобы получить сигнал со значением @(1)
я хотел.)
I У меня было очень трудное время выяснить, какой входной сигнал я могу предоставить MPSTicker, который я могу вручную отправить значения. Я представляя испытание, как:
<set up ticker>
<send a tick value>
<verify accumulated value is 1>
<send another value>
<verify accumulated value is 2>
Я попытался с помощью RACSubject
так что я могу использовать sendNext:
запихнуть в ценностях, как я считаю нужным, но это не работает, как я ожидал. Вот два сломанных испытания:
- (void)testManualTimerTheFirst
{
// Create a custom tick with one value to send.
RACSubject *controlledSignal = [RACSubject subject];
MPSTicker *ticker = [[MPSTicker alloc] initWithTickSource:controlledSignal];
[ticker.accumulateSignal subscribeNext:^(id x) {
NSLog(@"%s value is %@", __func__, x);
}];
[controlledSignal sendNext:@(2)];
}
- (void)testManualTimerTheSecond
{
// Create a custom tick with one value to send.
RACSubject *controlledSignal = [RACSubject subject];
MPSTicker *ticker = [[MPSTicker alloc] initWithTickSource:controlledSignal];
BOOL success = NO;
NSError *error = nil;
id value = [ticker.accumulateSignal asynchronousFirstOrDefault:nil success:&success error:&error];
if (!success) {
XCTAssertTrue(success, @"Signal failed to return a value. Error: %@", error);
} else {
XCTAssertNotNil(value, @"Signal returned a nil value.");
XCTAssertEqualObjects(@(1), value, @"Signal returned an unexpected value.");
}
// Send a value.
[controlledSignal sendNext:@(1)];
}
В testManualTimerTheFirst
, я никогда не видел никакой ценности из controlledSignal
«s sendNext:
прийти до моего subscribeNext:
блока.
В testManualTimerTheSecond
, я попытался с помощью asynchronousFirstOrDefault:
вызова, чтобы получить первое значение из сигнала, затем посылается вручную значение по моей теме, но стоимость не придет через, и тест не пройден, когда asynchronousFirstOrDefault:
истекло.
Что мне здесь не хватает?