我有一个方法,我想使用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被拒绝会发生什么。
答案 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