iOS Kiwi / Nocilla测试没有调用块

时间:2013-06-29 23:14:01

标签: ios unit-testing bdd kiwi nocilla

我正在努力熟悉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参数。我的测试构造错误吗?

谢谢!

1 个答案:

答案 0 :(得分:4)

测试的一般结构看起来不错。对于asynchronous testing,请使用:

[[expectFutureValue(theValue(successJson != nil)) shouldEventually] beTrue];

上面!= nilbeTrue的原因是没有应该用于测试最终nil值的最终+ notBeNil组合。上面的测试会发现successJson最初为零,因此将继续轮询该值,直到您的回调使其为非零。

请注意,如果您正在进行正面测试,例如检查successJson == @“test”,那么您可以使用更简单的表格来满足期望:

[[expectFutureValue(successJson) shouldEventually] equal:@"test"];

另请注意,您可以使用shouldEventuallyBeforeTimingOutAfter(2.0)将默认超时(我认为为1秒)增加到异步预期所需的超时时间。