2016-10-11 56 views
0

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

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 

有没有人知道我在做什么错我的根?

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

回答

1

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

我想你的榜样(为简单的JS,因为只有有来自ES6 /打字稿import语句),并用它按预期工作稍作修改。

因此,也许通过一次从工作中去除一步到打破可以告诉你哪个部件行为不当。

下面的代码使用从节点V6.6与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 
+0

谢谢。问题是,在我的代码中,我做了“let promise = MyService.method()...”,然后完成了诺言。当我删除它的工作。 – annedroiid