不能从sinon存根返回多个值

时间:2016-10-11 05:39:14

标签: javascript typescript bluebird sinon

我有一个方法,我想使用sinon存根,因此第一次调用它时返回一个值,然后在第二次调用时返回一个不同的值。但是目前只返回第一个值。我的代码在Typescript中,使用了Sinon和Bluebird(承诺)。

import sinon = require('sinon')
import * as MyService from "../main/Service"
import * as Promise from "bluebird"

it("test things", function(done) {
  let serviceStub = sinon.stub(MyService, 'method')

  serviceStub.onFirstCall().returns(Promise.reject("rejected"))
    .onSecondCall().returns(Promise.resolve("resolved"))

  MyService.method().then(function(value) {
    console.log("success 1: "+value.value())
  }, function(error) {
    console.log("error 1: "+error)
  })

  MyService.method().then(function(value) {
    console.log("success 2: "+value.value())
  }, function(error) {
    console.log("error 2: "+error)
  })

  done()
})

我认为我必须对茬做错事,因为这是我第一次使用sinon。如果它按照我的预期返回Promise.reject("rejected")然后Promise.resolve("resolved"),则会产生以下输出。

error 1: rejected
success 2: resolved

然而,它只会在两次打印出相同的错误,因此onSecondCall()方法无效。我给它的第一个值Promise.reject("rejected"),在调用方法的两次都被返回。

error 1: rejected
error 2: rejected

有人知道我的短信错误吗?

注意:对于不熟悉bluebird / promises的人,在方法then(function(value){}, function(error){})中,第一个函数处理如果promise被解析会发生什么,第二个函数处理如果promise被拒绝会发生什么。

1 个答案:

答案 0 :(得分:2)

我认为您的用法可能是正确的,但依赖关系正在搞乱;由于以下测试:

我尝试了你的例子(为了简单起见,因为只有来自es6 / typescript的import语句),并且稍作修改就能按预期工作。

因此,或许通过从工作到拆除一步一步删除可以显示哪个组件行为不端。

以下代码使用来自Node v6.6的本机Promise,其中value.value()仅由value替换,因为string不包含方法'value'

let sinon = require('sinon')

let MyService = { method() {}}

let serviceStub = sinon.stub(MyService, 'method')

serviceStub.onFirstCall().returns(Promise.reject("rejected"))
    .onSecondCall().returns(Promise.resolve("resolved"))

MyService.method().then(function (value) {
    console.log("success 1: " + value)
}, function (error) {
    console.log("error 1: " + error)
})

MyService.method().then(function (value) {
    console.log("success 2: " + value)
}, function (error) {
    console.log("error 2: " + error)
})

返回

>node sinon.js                              
error 1: rejected                                                           
success 2: resolved