【发布时间】:2014-02-04 23:28:58
【问题描述】:
(我可能以完全不正确的方式使用它,所以请随意挑战这篇文章的前提。)
我有一个小的RACTest app (sound familiar?) 我正在尝试对其进行单元测试。我想测试MPSTicker,它是最基于 ReactiveCocoa 的组件之一。如果累积标志设置为“是”,它有一个每秒发送一次累积值的信号。我added an initializer 为其递增信号采用自定义信号,而不是仅基于计时器。
我想对 MPSTicker 的一些行为进行单元测试:
- 当启用累加并且输入递增信号发送新值时,验证其累加信号是否正确递增(即单调递增)。
- 验证它在输入信号发送值时发送相同的值(而不是增加的值)。
我添加了a test that uses the built-in timer to test the first increment,它按我的预期工作(尽管我正在寻求关于改进愚蠢的 RACSequence 初始化的建议,以便获得我想要的 @(1) 值的信号。)
我很难弄清楚我可以向 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 的sendNext: 中的任何值通过我的subscribeNext: 块。
在testManualTimerTheSecond 中,我尝试使用asynchronousFirstOrDefault: 调用从信号中获取第一个值,然后在我的主题上手动发送一个值,但该值没有通过,当@987654337 时测试失败@超时。
我在这里错过了什么?
【问题讨论】:
标签: unit-testing reactive-cocoa