如何通过Sinon.js测试函数调用序列?
例如,我在对象中有三(3)个处理程序,并且想要定义处理程序调用的序列。这有可能吗?
答案 0 :(得分:19)
答案 1 :(得分:1)
对于遇到这种情况的人,他们正在寻找一种方法来定义具有调用序列上指定行为的存根。没有直接的方法(就我所见)说:“这个存根将被调用 X
次,在第一次调用时它将接受参数 a
并返回 b
在第二次调用时,它将采用参数 c
并返回 d
..." 等等。
我发现最接近这种行为的是:
const expectation = sinon.stub()
.exactly(N)
.onCall(0)
.returns(b)
.onCall(1)
.returns(d)
// ...
;
// Test that will end up calling the stub
// expectation.callCount should be N
// expectation.getCalls().map(call => call.args) should be [ a, b, ... ]
通过这种方式,我们可以在序列中的每个调用中返回特定值,然后断言调用是使用我们期望的参数进行的。
答案 2 :(得分:0)
Gajus提到overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out)
不再可用,您可以使用callOrder()
,callBefore()
,calledAfter()
和calledImmediatelyBefore()
。
我发现通过使用calledImmediatelyAfter()
获得所有调用并对调用参数执行spy.getCalls()
来断言一个间谍的顺序调用是最方便的。
示例-确认assert.deepEqual()
个调用的顺序。
console.log()
在您的测试用例中
// func to test
function testee() {
console.log(`a`)
console.log(`b`)
console.log(`c`)
}
答案 3 :(得分:0)
还有一个sinon-chai插件。
https://www.npmjs.com/package/sinon-chai-in-order
expect(spy).inOrder.to.have.been.calledWith(1)
.subsequently.calledWith(2)
.subsequently.calledWith(3);