不能 return 来自 sinon 存根的多个值

Can't return more than one value from a sinon stub

我有一个要使用 sinon 存根的方法,以便第一次调用它时 returns 一个值,然后在第二次调用时 returns 一个不同的值。但是目前只返回第一个值。我的代码在 Typescript 中并使用 Sinon 和 Bluebird (promises)。

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。如果它 returns 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){}) 中,第一个函数处理承诺被解决时发生的事情,第二个函数处理承诺被拒绝时发生的事情。

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

我尝试了您的示例(为了在 js 中简单起见,因为只有来自 es6/typescript 的导入语句)并且稍作修改就可以按预期工作。

因此,也许通过移除从正常工作到损坏的过程中一次采取一个步骤可以告诉您哪个组件出现问题。

以下代码使用 Node v6.6 中的原生 Promises,其中 value.value() 被简单的值替换,因为字符串不包含方法 '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)
})

returns

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