使用参数验证对自身进行 CallOrder of Fake

时间:2021-02-14 06:23:58

标签: sinon

如何在 sinon.js 中使用参数验证对假货进行调用顺序验证? 这是同一个假货,用不同的参数多次调用...... 类似下面的东西

        let someFake = sinon.fake();
        someFake(1);
        someFake(2);
        someFake(3);
        sinon.assert.callOrder(someFake.calledWith(1), someFake.calledWith(2), 
        someFake.calledWith(3));

1 个答案:

答案 0 :(得分:0)

您本质上使用了错误的 API,因此您没有得到预期的结果也就不足为奇了 :) 如果您查看 callOrder 的文档,您会看到签名使用的是 {{1 }},这表明它会被不止一个间谍使用。假货在实现上也是间谍,所以间谍 API 的所有部分也适用于假货。 From the docs

<块引用>

创建的假函数,无论有无行为,其 API 与 sinon.spy 相同

一个有点令人困惑的边节点是,文档经常使用术语“假”来适用于任何假对象或函数,而不是专门使用 spy1, spy2, .. API 创建的函数,尽管这不应该在这种特殊情况下是一个问题。

关于您最初的问题,从 Sinon 1.0 开始,Spy API 已经为您提供了帮助。您使用 getCall(n) 返回第 n 个调用。文档中有很多用于此的交互式示例,但基本上您只需这样做:

sinon.fake
// dumbed down version of https://runkit.com/fatso83/stackoverflow-66192966

const fake = sinon.fake();
fake(1);
fake(20);
fake(300);

sinon.assert.calledThrice(fake);       
assertEquals(1, fake.getCall(0).args[0])
assertEquals(20, fake.secondCall.args[0])
assertEquals(300, fake.lastCall.args[0])

function assertEquals(arg1,arg2){
  if(arg1 !== arg2) { 
     throw new Error(`Expected ${arg1} to equal ${arg2}`); 
  }
  console.log(`${arg1} equal ${arg2}: OK`)
}