单元测试Javascript Web工作者。并在Web Worker中模拟http调用
我是网络工作者的新手。我已经编写了一个web worker,它在onmessage事件上获取消息并读取数据,然后它进行ajax/http调用以获取数据。一旦从ajax/http调用返回数据,它就会使用postMessage事件将消息发回。 现在我想知道如何使用Jasmine和Karma对这个web工作者进行单元测试。我尝试过测试它,但无法模拟web worker内部的http调用。下面是我的代码。提前谢谢 worker.js单元测试Javascript Web工作者。并在Web Worker中模拟http调用,javascript,http,jasmine,mocking,web-worker,Javascript,Http,Jasmine,Mocking,Web Worker,我是网络工作者的新手。我已经编写了一个web worker,它在onmessage事件上获取消息并读取数据,然后它进行ajax/http调用以获取数据。一旦从ajax/http调用返回数据,它就会使用postMessage事件将消息发回。 现在我想知道如何使用Jasmine和Karma对这个web工作者进行单元测试。我尝试过测试它,但无法模拟web worker内部的http调用。下面是我的代码。提前谢谢 worker.js (function () { 'use strict'; var s
(function () {
'use strict'; var startDate, endDate, token, initialized;
var http = {};
/* Code To make http request - Starts */
http.x = function () {
if (typeof XMLHttpRequest !== 'undefined') {
return new XMLHttpRequest();
}
var versions = [
"MSXML2.XmlHttp.6.0",
"MSXML2.XmlHttp.5.0",
"MSXML2.XmlHttp.4.0",
"MSXML2.XmlHttp.3.0",
"MSXML2.XmlHttp.2.0",
"Microsoft.XmlHttp"
];
var xhr;
for (var i = 0; i < versions.length; i++) {
try {
xhr = new ActiveXObject(versions[i]);
break;
} catch (e) {
}
}
return xhr;
};
http.send = function (url, callback, method, data, async, headerToken) {
if (async === undefined) {
async = true;
}
var x = http.x();
x.open(method, url, async);
if (headerToken !== null && headerToken !== "") {
x.setRequestHeader("Authorization", "Bearer " + headerToken);
}
x.onreadystatechange = function () {
if (x.readyState === 4 && x.responseText !== "" && x.responseText !== undefined && x.responseText !== null) {
callback(JSON.parse(x.responseText));
}
};
x.send(data);
};
http.get = function (url, data, callback, async, headerToken) {
var query = [];
for (var key in data) {
if (data.hasOwnProperty(key)) {
query.push(encodeURIComponent(key) + '=' + encodeURIComponent(data[key]));
}
}
http.send(url + (query.length ? '?' + query.join('&') : ''), callback, 'GET', null, async, headerToken);
};
/* Code To make http request - ends */
var postOpenOrdersTile = function (result) {
if (result) {
postMessage('<div id="openOrdersTile" class="tileContent">' +result.TotalOpenOrders +'</div>');
}
};
function run(url) {
var baseUrl = url;
var openOrdersTilesUrl = baseUrl + "/DashboardTiles/GetOpenOrderTileValues";
http.get(openOrdersTilesUrl, createDashboardTileInput(startDate, endDate), postOpenOrdersTile, true, token);
}
var load = function (response) {
var baseUrl = response.base + response.api;
run(baseUrl);
}
/* Code To triggere Worker - onmessage */
self.onmessage = function (msg) {
if (msg.data.baseUrl && !initialized) {
self.importScripts(msg.data.baseUrl + '/BaseApp/Scripts/moment.js');
startDate = msg.data.fromDate;
endDate = msg.data.toDate;
token = msg.data.token;
http.get(msg.data.baseUrl + '/CardioDashboard/config.json', '', load, true, '');
}
};}());
(函数(){
'use strict';var startDate、endDate、token、initialized;
var http={};
/*用于发出http请求的代码-启动*/
http.x=函数(){
if(XMLHttpRequest的类型!=“未定义”){
返回新的XMLHttpRequest();
}
变量版本=[
“MSXML2.XmlHttp.6.0”,
“MSXML2.XmlHttp.5.0”,
“MSXML2.XmlHttp.4.0”,
“MSXML2.XmlHttp.3.0”,
“MSXML2.XmlHttp.2.0”,
“Microsoft.XmlHttp”
];
var-xhr;
对于(变量i=0;i
WorkerSpec.js
define([],
function () { 'use strict'
describe('Web Worker : Tiles Sharing web Worker', function () { .
var worker, data ;
http = { get: function () { return {} } };
beforeEach(function () {
worker = new Worker('path/Worker.js');
data = {
baseUrl: "xyz",
fromDate: '2017-04-13',
toDate: '2017-04-07',
token: ''
};
worker.postMessage(data);
});
afterEach(function () {
});
it('Tests the Webworker', function (done) {
spyOn(http, 'get').and.returnValue({});
spyOn(window, 'postOpenOrdersTile').and.callFake(function () {
return {};
});
worker.addEventListener('message', function (e) {
if (e.data) {
expect(e.data).toBe('<div id="openOrdersTile" class="tileContent">45</div>');
}
if (triggerCount === 6) {
done();
}
});
});
});});
定义([],
函数(){'use strict'
描述('webworker:Tiles共享webworker',函数(){。
var工作者,数据;
http={get:function(){return{}};
beforeach(函数(){
worker=newworker('path/worker.js');
数据={
baseUrl:“xyz”,
起始日期:“2017-04-13”,
今天:“2017-04-07”,
令牌:“”
};
worker.postMessage(数据);
});
在每个(函数()之后){
});
它('测试Webworker',函数(完成){
spyOn(http,'get').and.returnValue({});
spyOn(窗口,'postOpenOrdersTile')。和.callFake(函数(){
返回{};
});
worker.addEventListener('message',函数(e){
如果(如数据){
expect(e.data)toBe('45');
}
如果(触发器计数===6){
完成();
}
});
});
});});
输出为null的原因是postOpenOrdersTile
的参数为null。我不确定你是否真的在测试任何有用的东西,因为你必须模仿一切。但是尝试模拟http.get:{TotalOpenOrders:45}
的返回值
您可以将Worker设置为构造函数并将http附加到它:
var Worker = function() {
this.http = {
send: function() {
// do something
},
get: function() {
// do something
}
};
}
在测试中:
spyOn(worker.http,'get').and.returnValue({})代码>测试的输出是什么?输出预期为空,等于45。由于web worker实际上正在进行http调用,但我们的服务需要在标头中传递令牌。因为是单元测试,所以我没有传递实际的令牌。因为我只是在测试web工作者的行为,所以我不想调用htpp,而是需要模拟http并返回一些我需要的值。谢谢你的回复我,谢谢你的回复。实际上,我还有一些其他的函数来处理http.get数据的输出。我没有把它加在这里,对不起我的不好。实际上,我需要模拟http.get函数并检查所有其他后处理数据的函数。您能建议我如何在此场景中模拟http.get吗?您应该能够使用spyOn(object,'function')。和.returnValue({})模拟为postOpenOrdersTile()提供数据的任何函数代码>。我还建议检查一下嘲弄性的承诺。您可以使用native Promise.Hi来代替$.defer,因为我在测试规范中实例化了一个新的worker实例,它实际上触发了web worker。那么,是否有可能监视http,在Web Worker中获取请求呢。我试着这么做,但没有成功。请建议我,如果它是可能的间谍功能内的网络工作者