从promise javascript中的sinon.spy获取回调参数

时间:2017-08-05 14:15:06

标签: javascript callback promise mocha sinon

我正在使用mocha和sinon运行测试,以从HTTP请求的promise范围内获取回调值,并且由于promises的异步性质,它不起作用。这是因为当sinon.spy检查回调时,它已经消失并变为空或未定义。这是测试代码:

 it('should issue GET /messages ', function() {
  server.respondWith('GET', `${apiUrl}/messages?counter=0`, JSON.stringify([]));
  let callback = sinon.spy();
  Babble.getMessages(0, callback);
  server.respond();
  sinon.assert.calledWith(callback, []);
});

和承诺:

function requestPoll(props) {
    return new Promise(function(resolve, reject) {
            var xhr = new XMLHttpRequest();
            xhr.open(props.method, props.action);
            xhr.timeout = 500; // time in milliseconds
            if (props.method === 'post' ) {
                    xhr.setRequestHeader('Content-Type', 'application/json');
            }
            xhr.addEventListener('load', function(e) {
                    resolve(e.target.responseText);
            });

            xhr.send(JSON.stringify(props.data));


    });
}

以及我试图从sinon.spy获得回调的电话

getMessages: function(counter, callback){

            requestPoll({

                            method: "GET",
                            action: "http://localhost:9090/messages?counter="+counter

            }).then(function(result){

                    callback(result);
            });


        }

sinon.spy说它没有任何参数(由于异步功能)。我试图寻找一种方法来获得范围之外的结果并将其放在callback.yet上我发现它是不可能的。也尝试过决心并承诺回归,但没有成功。

如何让这个单元测试通过?

编辑:
这是我的尝试:

getMessages: function(counter, callback){

            var res;
            res = httpRequestAsync("GET",'',"http://localhost:9097/messages?counter=",counter);

            console.log(res);
            if(res!="")
                    callback( JSON.parse(res) );                      
        }

我将请求放在一个单独的函数中:

function httpRequestAsync(method,data,theUrl,counter)
    {

            return requestPoll({

                    method: method,
                    action: theUrl+counter,
                    data: data

            }).then(JSON.parse);

    }

它作为承诺返回res,在其原型中,我需要承诺的价值。 enter image description here

如何在那里访问承诺的值?

1 个答案:

答案 0 :(得分:2)

我建议你不要混淆承诺和回调。如果你已经有基于承诺的功能坚持它

首先让<div ng-app="myApp"> <div ng-controller="AppController"> <h1> {{'{{ data }}' }}</h1> </div> 不要破坏承诺。让它返回一个承诺

getMessages

然后在测试中使用此承诺

getMessages: function(counter) {
  return requestPoll({
    method: "GET",
    action: "http://localhost:9090/messages?counter=" + counter
  }).then(JSON.parse)
}