我怎样才能测试Sinon.js的函数调用序列?

时间:2013-03-31 15:14:47

标签: javascript unit-testing sinon

如何通过Sinon.js测试函数调用序列?

例如,我在对象中有三(3)个处理程序,并且想要定义处理程序调用的序列。这有可能吗?

4 个答案:

答案 0 :(得分:19)

http://sinonjs.org/docs/

sinon.assert.callOrder(spy1,spy2,...)

如果提供的间谍以指定的顺序进行调用,则通过。

答案 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);