3

我可以使用下面的代码来测试巡洋舰是否被调用了两次。但是如何测试第一次调用的参数是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
4

1 回答 1

1

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

假设您有一个Cruiser具有单个实例的对象WarpCore. 发送Cruiser消息engage应该启动经线核心,然后将其启动到全速:

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];
        });
    });
});

消息模式是测试参数的一种方式(您也可以使用receive:withArguments:)。上面的示例演示了为同一个选择器设置两个期望,但具有不同的参数,会导致两个唯一的断言。

您还可以使用Capture Spies更复杂的场景中测试参数,例如异步代码

于 2013-06-16T11:10:45.623 回答