0

我正在寻找一种测试嵌套对象属性的方法。本质上,我有一个规范,它将验证我们从外部服务返回的结果。由于我不想为要测试的每个示例对服务进行大量调用,因此在规范开始时发出一次请求,然后我们一组期望验证响应。

最好用代码示例进行解释(显然,它不能按预期工作):

    beforeAll(^{
        wait = [self waitFor:^(id handler) { [session.account all:handler]; }];
        accounts = wait.result;
    });

    it(@"should make a successfull request", ^{
        [[wait should] beSuccessful];
    });

    it(@"returns a non-nil list of accounts", ^{
        [[accounts shouldNot] beNil];
    });

    it(@"should have at least 1 account", ^{
        [[[accounts.accounts should] haveAtLeast:1] account];
    }); 

    context(@"each account", ^{
        for (Account* account in accounts.accounts) {
            it(@"should have a name", ^{
                [[account.name shouldNot] beEmpty];
            });
            it(@"should have an accountID", ^{
                [[account.accountID shouldNot] equal:@"bla"];
            });
        }
    });
});

这是我感兴趣的“每个帐户”上下文。基本上,调用返回一组帐户,我想要每个帐户的有效性。

我可以把它转过来并在 it() 块中设置循环,这有点工作,但它并没有告诉我哪个项目有问题,并且所有验证器都在一个有问题的项目之后运行(例如,当遇到 nil account.name ) 返回Trying to add another verifier without specifying a matcher for the previous one.错误。所以,不是很实用。

我考虑只测试返回的 json,因为我们还有一组规范用于(单元)测试我们自己的组件,而不管我们从服务获得的响应如何。但这不起作用,因为我们并不真正关心确切的数据集(也很容易改变),只是格式应该是正确的。

在使用本地测试数据编写规范时,我会为层次结构中的每个级别编写几个规范,但我想把它放在一起:我想完整地测试从服务器收到的一个响应。

我已经尝试通过在测试运行时添加更多 KWExamples 来动态执行此操作,但这似乎不起作用。

有什么想法(或者我是否将它误用于不打算做的事情)?

(也发布为 Github 问题:https ://github.com/allending/Kiwi/issues/435 )

4

1 回答 1

1

每个规范都必须是唯一的名称。在您的示例中,您正在添加x具有相同名称的规范。我认为最好只有 2 个规格。只需在两者中迭代您的数组:

context(@"each account", ^{
    it(@"should have a name", ^{
       for (Account* account in accounts.accounts) {
            [[account.name shouldNot] beEmpty];
       }
    });
    it(@"should have an accountID", ^{
       for (Account* account in accounts.accounts) {
            [[account.accountID shouldNot] equal:@"bla"];
       }
    });
});
于 2014-01-28T05:52:21.113 回答