【问题标题】:Can't return more than one value from a sinon stub不能从 sinon 存根返回多个值
【发布时间】:2017-02-19 15:08:26
【问题描述】:

我有一个方法,我想使用 sinon 来存根,以便第一次调用它时返回一个值,然后在第二次调用时返回一个不同的值。然而,目前只返回第一个值。我的代码在 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。如果它返回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 被拒绝会发生什么。

【问题讨论】:

    标签: javascript typescript bluebird sinon


    【解决方案1】:

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

    我尝试了您的示例(为了简化 js,因为只有来自 es6/typescript 的 import 语句)并且稍作修改,它就可以按预期工作。

    因此,也许通过从工作到损坏一次一步移除可以向您显示哪个组件行为不端。

    以下代码使用 Node v6.6 中的原生 Promises,将 value.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)
    })
    

    返回

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

    【讨论】:

    • 谢谢。问题是在我的代码中我已经完成了“let promise = MyService.method()...”,然后在 promise 上完成了 then 。当我删除它时它起作用了。
    猜你喜欢
    • 2015-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-05
    • 2017-04-09
    • 2016-09-13
    • 2018-03-29
    • 2021-10-16
    相关资源
    最近更新 更多