Unit testing 单元测试RACSignal与RACSubject的简单用法
(我可能是用了一种完全不正确的方式,所以请随意挑战这篇文章的前提。) 我有一个小()我正在尝试进行单元测试。我想测试一个最具反应性的基于可可粉的组件。当累加标志设置为“是”时,它有一个每秒发送一次累加值的信号。我希望将自定义信号作为其递增信号,而不是仅基于计时器 我想对MPSTicker的几个行为进行单元测试:Unit testing 单元测试RACSignal与RACSubject的简单用法,unit-testing,reactive-cocoa,Unit Testing,Reactive Cocoa,(我可能是用了一种完全不正确的方式,所以请随意挑战这篇文章的前提。) 我有一个小()我正在尝试进行单元测试。我想测试一个最具反应性的基于可可粉的组件。当累加标志设置为“是”时,它有一个每秒发送一次累加值的信号。我希望将自定义信号作为其递增信号,而不是仅基于计时器 我想对MPSTicker的几个行为进行单元测试: 确认当累加启用且输入递增信号发送新值时,累加信号正确递增(即单调递增) 验证当输入信号发送值时,它是否发送相同的值(而不是递增的值) 我已经添加了,它的工作原理与我预期的一样(尽管我
- 确认当累加启用且输入递增信号发送新值时,累加信号正确递增(即单调递增)
- 验证当输入信号发送值时,它是否发送相同的值(而不是递增的值)
@(1)
值的信号而做的)
我一直很难弄清楚我可以向MPSTicker提供什么样的输入信号,我可以手动向其发送值。我正在设想一个测试,如:
<set up ticker>
<send a tick value>
<verify accumulated value is 1>
<send another value>
<verify accumulated value is 2>
在testManualTimerTheFirst
中,我从未从controlled signal
的sendNext:
到我的subscribeNext:
块中看到任何值
在testManualTimerTheSecond
中,我尝试使用asynchronousFirstOrDefault:
调用从信号中获取第一个值,然后手动向我的主题发送一个值,但该值没有通过,当asynchronousFirstOrDefault:
超时时,测试失败
我在这里遗漏了什么?请看这个问题:
有一些额外的功能来允许异步测试用例
另外,我还没有深入研究它,但你可能会感兴趣吗?乍一看,他们似乎在使用Expecta。请参见以下问题:
有一些额外的功能来允许异步测试用例
另外,我还没有深入研究它,但你可能会感兴趣吗?乍一看,他们似乎在使用Expecta。这可能无法准确回答您的问题,但它可能会让您了解如何有效地测试您的信号。到目前为止,我自己使用了两种方法: XCTestCase和TRVSMonitor 是一个小实用程序,它将在运行断言时为您暂停当前线程。例如:
TRVSMonitor *monitor = [TRVSMonitor monitor];
[[[self.service searchPodcastsWithTerm:@"security now"] collect] subscribeNext:^(NSArray *results) {
XCTAssertTrue([results count] > 0, @"Results count should be > 0";
[monitor signal];
} error:^(NSError *error) {
XCTFail(@"%@", error);
[monitor signal];
}];
[monitor wait];
如您所见,我告诉监视器在订阅后立即等待,并在subscribeNext和error块结束时发出停止等待的信号,以使其继续执行(这样其他测试也可以运行)。这种方法的好处是不依赖于静态超时,因此您的代码可以根据需要运行多长时间
使用CocoaPods,您可以轻松地将TRVSMonitor添加到项目中:
pod "TRVSMonitor", "~> 0.0.3"
Specta&Expecta
是一个BDD/TDD(行为驱动/测试驱动)测试框架。Expecta是一个提供更方便的断言匹配器的框架。它内置了对异步测试的支持。它使您能够使用ReactiveCocoa编写更多描述性测试,如下所示:
it(@"should return a valid image, with cache state 'new'", ^AsyncBlock {
[[cache imageForURL:[NSURL URLWithString:SECURITY_NOW_ARTWORK_URL]] subscribeNext:^(UIImage *image) {
expect(image).notTo.beNil();
expect(image.cacheState).to.equal(JPImageCacheStateNew);
} error:^(NSError *error) {
XCTFail(@"%@", error);
} completed:^{
done();
}];
});
注意使用^AsyncBlock{。简单地使用^{将意味着同步测试
这里调用done()函数来表示异步测试的结束。我相信Specta在内部使用10秒超时
使用CoCoapod,您可以轻松添加Expecta和Specta:
pod "Expecta", "~> 0.2.3"
pod "Specta", "~> 0.2.1"
这可能无法准确回答您的问题,但它可能会让您了解如何有效地测试您的信号。到目前为止,我自己使用了两种方法: XCTestCase和TRVSMonitor 是一个小实用程序,在您运行断言时,它将为您暂停当前线程。例如:
TRVSMonitor *monitor = [TRVSMonitor monitor];
[[[self.service searchPodcastsWithTerm:@"security now"] collect] subscribeNext:^(NSArray *results) {
XCTAssertTrue([results count] > 0, @"Results count should be > 0";
[monitor signal];
} error:^(NSError *error) {
XCTFail(@"%@", error);
[monitor signal];
}];
[monitor wait];
如您所见,我告诉监视器在订阅后立即等待,并在subscribeNext和错误块结束时发出停止等待的信号,以使其继续执行(这样其他测试也可以运行)。这种方法的好处是不依赖静态超时,因此您的代码可以根据需要运行多长时间
使用CocoaPods,您可以轻松地将TRVSMonitor添加到项目中:
pod "TRVSMonitor", "~> 0.0.3"
Specta&Expecta
是一个BDD/TDD(行为驱动/测试驱动)测试框架。Expecta是一个提供更方便的断言匹配器的框架。它内置了对异步测试的支持。它使您能够使用ReactiveCocoa编写更多描述性测试,如下所示:
it(@"should return a valid image, with cache state 'new'", ^AsyncBlock {
[[cache imageForURL:[NSURL URLWithString:SECURITY_NOW_ARTWORK_URL]] subscribeNext:^(UIImage *image) {
expect(image).notTo.beNil();
expect(image.cacheState).to.equal(JPImageCacheStateNew);
} error:^(NSError *error) {
XCTFail(@"%@", error);
} completed:^{
done();
}];
});
注意使用^AsyncBlock{。简单地使用^{将意味着同步测试
这里调用done()函数来表示异步测试的结束。我相信Specta在内部使用10秒超时
使用CoCoapod,您可以轻松添加Expecta和Specta:
pod "Expecta", "~> 0.2.3"
pod "Specta", "~> 0.2.1"