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