Unit testing 单元测试RACSignal与RACSubject的简单用法

Unit testing 单元测试RACSignal与RACSubject的简单用法,unit-testing,reactive-cocoa,Unit Testing,Reactive Cocoa,(我可能是用了一种完全不正确的方式,所以请随意挑战这篇文章的前提。) 我有一个小()我正在尝试进行单元测试。我想测试一个最具反应性的基于可可粉的组件。当累加标志设置为“是”时,它有一个每秒发送一次累加值的信号。我希望将自定义信号作为其递增信号,而不是仅基于计时器 我想对MPSTicker的几个行为进行单元测试: 确认当累加启用且输入递增信号发送新值时,累加信号正确递增(即单调递增) 验证当输入信号发送值时,它是否发送相同的值(而不是递增的值) 我已经添加了,它的工作原理与我预期的一样(尽管我

(我可能是用了一种完全不正确的方式,所以请随意挑战这篇文章的前提。)

我有一个小()我正在尝试进行单元测试。我想测试一个最具反应性的基于可可粉的组件。当累加标志设置为“是”时,它有一个每秒发送一次累加值的信号。我希望将自定义信号作为其递增信号,而不是仅基于计时器

我想对MPSTicker的几个行为进行单元测试:

  • 确认当累加启用且输入递增信号发送新值时,累加信号正确递增(即单调递增)
  • 验证当输入信号发送值时,它是否发送相同的值(而不是递增的值)
我已经添加了,它的工作原理与我预期的一样(尽管我正在寻求改进goofy RACSequence初始化的建议,我是为了得到一个带有我想要的
@(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"