我正在努力熟悉Kiwi BDD测试框架。我正在使用它与Nocilla一起模拟HTTP请求。这两个项目看起来都很棒,但我遇到了一些困难。我有以下测试规范:
beforeAll(^{ // Occurs once
[[LSNocilla sharedInstance] start];
});
afterAll(^{ // Occurs once
[[LSNocilla sharedInstance] stop];
});
beforeEach(^{ // Occurs before each enclosed "it"
couch = [[Couch alloc]initWithDatabaseUrl:@"http://myhost/mydatabase"];
});
afterEach(^{ // Occurs after each enclosed "it"
[[LSNocilla sharedInstance] clearStubs];
});
it(@"should be initialized", ^{
[couch shouldNotBeNil];
});
context(@"GET requests", ^{
it(@"should get document by id", ^{
__block NSData *successJson = nil;
__block NSError *requestErr = nil;
stubRequest(@"GET", @"http://myhost/mydatabase/test").
withHeader(@"Accept", @"application/json").
withBody(@"{\"_id\":\"test\",\"_rev\":\"2-77f66380e1670f1876f15ebd66f4e322\",\"name\":\"nick\"");
[couch getDocumentById:@"test" success:^(NSData *json){
successJson = json;
} failure:^(NSError *error) {
requestErr = error;
}];
[[successJson shouldNot]equal:nil];
});
});
对于长代码段,我们深表歉意。我想确保我给出背景信息。正如您所看到的,我正在测试一个对象的行为,该对象发出GET请求并在“成功”块中报告结果并报告“失败”块中的错误。我有两个__block vars来接收存储成功和失败。目前,测试检查'success'var是否具有值(不是nil)。这个测试通过。但是,调试此测试时,似乎没有块执行过。 successJson显示为零。我希望Nocilla已将存根体内容传递给success block参数。我的测试构造错误吗?
谢谢!
答案 0 :(得分:4)
测试的一般结构看起来不错。对于asynchronous testing,请使用:
[[expectFutureValue(theValue(successJson != nil)) shouldEventually] beTrue];
上面!= nil
和beTrue
的原因是没有应该用于测试最终nil值的最终+ notBeNil组合。上面的测试会发现successJson
最初为零,因此将继续轮询该值,直到您的回调使其为非零。
请注意,如果您正在进行正面测试,例如检查successJson == @“test”,那么您可以使用更简单的表格来满足期望:
[[expectFutureValue(successJson) shouldEventually] equal:@"test"];
另请注意,您可以使用shouldEventuallyBeforeTimingOutAfter(2.0)
将默认超时(我认为为1秒)增加到异步预期所需的超时时间。