gpt4 book ai didi

angularjs - web worker的单元测试代码

转载 作者:行者123 更新时间:2023-12-01 02:12:56 25 4
gpt4 key购买 nike

https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/basic_usage 中的示例代码为例,以下由网络 worker 运行

// in worker.js
onmessage = function(e) {
console.log('Message received from main script');
var workerResult = 'Result: ' + (e.data[0] * e.data[1]);
console.log('Posting message back to main script');
postMessage(workerResult);
}

由 Angular 服务/工厂中的代码运行
var myWorker = new Worker("worker.js");

我希望能够对 worker.js 中的代码进行单元测试,理想情况下将其作为 Angular 服务/工厂的一部分运行(在 Web Worker 中运行的单独应用程序中?),因此我可以使用 DI 系统注入(inject)依赖项的模拟,并使单元测试代码看起来很像任何其他服务。我怎样才能做到这一点?

最佳答案

有一种方法可以做到这一点,其中在 web worker 中运行的主要代码作为单独的、手动引导的 Angular 模块的一部分运行。

为了在 web worker 中加载 Angular

  • 环境需要修补/猴子修补/黑客,因此 Angular 在加载和引导时不会因缺少 window 而引发各种异常和 document对象
  • 然后必须通过 importScripts 包含 Angular
  • 那么你想运行的模块必须通过importScripts 包含进来。
  • 然后模块手动引导。

  • 执行此操作的示例代码:
    // worker.js

    // Angular needs a global window object
    var window = self;

    // Skeleton properties to get Angular to load and bootstrap.
    self.history = {};
    var document = {
    readyState: 'complete',
    querySelector: function() {},
    createElement: function() {
    return {
    pathname: '',
    setAttribute: function() {}
    }
    }
    };

    // Load Angular: must be on same domain as this script
    importScripts('angular.js');

    // Put angular on global scope
    angular = window.angular;

    // Standard angular module definition
    importScripts('worker-app.js');

    // No root element seems to work fine
    angular.bootstrap(null, ['worker-app']);

    Angular 模块本身的代码可以非常标准:根据需要定义服务/工厂。在这种情况下,不需要任何东西,我选择将示例的简单代码作为 run回调(我从问题中省略了 console.log )。
    // worker-app.js
    (function() {
    'use strict';

    var app = angular.module('worker-app', []);

    app.run(function($window) {
    $window.onmessage = function(e) {
    var workerResult = 'Result: ' + (e.data[0] * e.data[1]);
    $window.postMessage(workerResult);
    };
    });

    })();

    然后可以使用完全相同的测试对其进行测试,就好像它不打算在 web worker 中运行一样:
    // worker-app-spec.js
    describe('worker-app', function() {
    'use strict';

    var $window;

    beforeEach(module('worker-app'));

    beforeEach(inject(function(_$window_) {
    $window = _$window_;
    }));

    beforeEach(function() {
    spyOn($window, 'postMessage');
    })

    it('attaches to $window onmessage', function() {
    var data = [2,3];
    var result = 'Result: ' + (data[0] * data[1]);
    $window.onmessage({data: data});
    expect($window.postMessage).toHaveBeenCalledWith(result);
    });
    });

    我不喜欢破解环境以加载 Angular,因为它对我来说非常脆弱,所以非常欢迎其他答案!上面的代码是使用 AngularJS v1.3.7 测试的。

    关于angularjs - web worker的单元测试代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27745813/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com