首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >单元测试Javascript Web工作者。并模拟Web工作者内部的http调用

单元测试Javascript Web工作者。并模拟Web工作者内部的http调用
EN

Stack Overflow用户
提问于 2017-04-20 22:21:55
回答 1查看 2.9K关注 0票数 2

我是网络工作者的新手。我编写了一个web工作人员,它获取消息并读取onmessage事件上的数据,然后进行ajax/http调用来获取数据。一旦从ajax/http调用返回数据,它就会使用postMessage事件回发消息。现在我想知道如何用茉莉花和卡玛对这个网络工作者进行单元测试。我试过测试它,但无法在web工作者内部屏蔽http调用。下面是我的密码。提前谢谢。

worker.js

代码语言:javascript
复制
(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, '');
    }
};}());

WorkerSpec.js

代码语言:javascript
复制
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();
            }
        });

    });
});});
EN

回答 1

Stack Overflow用户

发布于 2017-04-23 23:05:11

输出为<div id="openOrdersTile" class="tileContent">null</div>的原因是postOpenOrdersTile的参数为null。我不确定你是否真的在测试任何有用的东西,因为你必须模拟所有的东西。但是,尝试模拟http.get:{TotalOpenOrders: 45}的返回值。

您可以使员工成为一个构造函数,并将http附加到它:

代码语言:javascript
复制
var Worker = function() {
  this.http = {
    send: function() {
       // do something
    },
    get: function() {
      // do something
    }
  };
}

测试中:spyOn(worker.http, 'get').and.returnValue({});

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43530868

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档