如何用kiwi来测试函数调用的参数?

时间:2013-06-16 08:07:06

标签: objective-c unit-testing kiwi

我可以使用以下代码来测试巡洋舰已被调用两次。但是如何测试第一个调用的参数是7,第二个调用的参数是8?

id cruiser = [Cruiser cruiser];
[[cruiser should] receive:@selector(energyLevelInWrapCore:) withCount:2];
[cruiser energyLevelInWarpCore:7];
[cruiser energyLevelInWarpCore:8];

调用方法后是否可以获取参数?如下面的代码。

id cruiser = [Cruiser cruiser];
[cruiser stub:@selector(energyLevelInWarpCore:)];
[cruiser energyLevelInWarpCore:7];
[cruiser energyLevelInWarpCore:8];
[[[[[cruiser stub] calles][1] arguments][0] should] equal:theValue(8)]; // This doesn't work

1 个答案:

答案 0 :(得分:1)

你有真正的代码示例吗?在您给出的示例中,您已经在测试的顶部存根energyLevelInWarpCore:,因此测试永远不会失败,因为您没有调用任何其他代码。所有你真正在做的就是运用测试框架。

假设您有Cruiser个对象,其中包含WarpCore个实例。发送Cruiser消息engage应该为warp核心提供素数,然后将其提升到全速:

describe(@"Cruiser", ^{
    describe(@"-engage", ^{
        it(@"primes the warp core then goes to full speed", ^{
            id warpCore = [WarpCore mock];
            Cruiser *enterprise = [Cruiser cruiserWithWarpCore:warpCore];

            [[[warpCore should] receive] setEnergyLevel:7];
            [[[warpCore should] receive] setEnergyLevel:8];

            [enterprise engage];
        });
    });
});

Message patterns是测试参数的一种方法(您也可以使用receive:withArguments:)。上面的例子表明,为同一个选择器设置两个期望,但是使用不同的参数,会产生两个独特的断言。

您还可以使用Capture Spies来测试more complex scenarios, such as asynchronous code中的参数。