我如何测试Sinon.js函数调用的顺序
How can I test sequence of function calls by Sinon.js?
如何测试Sinon.js的函数调用顺序?
例如,我在对象中有三(3)个处理程序,并且想要定义处理程序调用的序列。这有可能吗?
http://sinonjs.org/docs/
sinon.assert。callOrder(spy1, spy2,…)
如果按指定顺序调用所提供的间谍,则传递。
对于遇到这种情况的人来说,寻找一种方法来定义具有调用序列上指定行为的存根。没有直接的方法(据我所见)说:"这个存根将被调用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, ... ]
通过这种方式,我们可以在序列中的每次调用中返回特定的值,然后断言调用是使用我们期望的形参进行的。
正如Gajus提到的,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`)
}
在您的测试用例
中const expected = [`a`, `b`, `c`]
const consoleSpy = spy(console, 'log')
testee()
const result = consoleSpy.getCalls().map(({ args }) => args[0])
assert.deepEqual(result, expected)
还有一个sinon-chai插件
https://www.npmjs.com/package/sinon-chai-in-orderexpect(spy).inOrder.to.have.been.calledWith(1)
.subsequently.calledWith(2)
.subsequently.calledWith(3);
相关文章:
- node.js测试事件是否是在不使用超时的情况下使用sinon.js发出的
- 什么'与Jasmine相比,使用Sinon.js的优势是什么;内置于间谍
- 是否可以使用Sinon.JS检查函数参数绑定是否正确
- sinon.js验证mock方法's带回调的参数
- 使用sinon.js创建一个“;“间谍对象”;使用基于真实构造函数/原型的间谍方法
- stub.callsArg(index) from Sinon.JS 是做什么的
- Stubbing async.waterfall with Sinon.JS
- 如何模拟快乐.js回复 Sinon 进行单元测试
- 测试Express.js res.render在承诺与Mocha&Sinon spy
- Sinon Not Mocking db-mysql Node.js library
- 使用 Sinon.js 测试 navigator.browserLanguage 或 navigator.languag
- 如何使用 sinon.js 来模拟/监视 javascript 函数中提到的对象
- 使用 Sinon.js 测试一个函数是否调用 ES6 模块中的另一个函数
- sinon.js监视$.dataTables函数
- 如何在Jasmine中每次测试后自动恢复所有sinon.js间谍
- 如何使用nightwatch.js和sinon.js模拟API响应
- 如何使用sinon.js实现mock/stub回调函数
- Sinon JS:有没有一种方法可以在对象参数's在sinon js中的键值
- 测试Backbone.js模型保存使用Sinon不调用成功回调
- 有buster.js / sinon类似' jasmine.any() '的东西