我正在使用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);
}
如何在那里访问承诺的值?
答案 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)
}