首页 > 解决方案 > importScript 和 worker-html.js 未能通过 jasmine/karma 测试用例

问题描述

如果我一起运行它们,我的几个测试用例会失败。单独他们都通过了。在添加了一些调试代码后jasmine.jsobject thrown error我发现所有与代码相关的错误都类似于

错误列表类似于Uncaught error prop: isTrusted, value: trueerror prop: message, value: Uncaught error prop: filename, value: blob:http://localhost:9882/7098c1f5-dfab-4a9e-8259-654164f3306d

该部分prop: filename, value: blob:http://localhost:9882/7098c1f5-dfab-4a9e-8259-654164f3306d映射到importScripts('http://localhost:9882/ace-builds/worker-html.js');

我不确定在这里做什么以及一起执行时如何通过测试用例。

路径是正确的,因为我可以在以下位置看到文件http://localhost:9882/ace-builds/worker-html.js

标签: angularjasminekarma-jasmineangular-test

解决方案


我无法确定确切的问题。这可能是由于使用blob:which was added to 解决 问题出现了content security policy issue。但是,正如这里所指出的(我是否需要在运行 jasmine/karma 测试用例时设置内容安全策略),如果是这样,csp那么问题应该一直发生而不是随机发生

" 浏览器在 devtools 控制台中记录什么消息?如果它由于 CSP 而失败,那么浏览器将在 devtools 控制台中记录特定的错误消息,明确说明它正在阻止什么以及为什么。所以如果你没有看到任何消息在 devtools 控制台中,您可以安全地排除 CSP 作为您所看到的故障的原因。如果是由于 CSP,故障将不是随机的;相反,它们是一致的。另外,添加对一个还没有的文档的 CSP 策略不会解决任何问题;相反,它只会导致进一步的阻塞发生。” 我做了很多事情来解决这个问题 1)我更改jasmine.js为添加调试打印这可以给我一些关于正在发生的事情的提示。

getJasmineRequireObj().ExceptionFormatter = function() {
...
    if(error){
           // message+=error;
            for(var propName in error) {
              propValue = error[propName]
              message+='\nError object: Property name: '+propName+', value: '+propValue;
            }
          }
return message;
};

以上开始为我打印详细信息。其中一张照片给了我线索,即问题可能与worker.js文件有关,ace.js因为这是我知道的唯一正在使用的代码workers

在此处输入图像描述

然后在ace.js论坛里,我发现我可以workers完全停止使用了。

" ace 正在尝试加载 webworker 以进行语法检查https://github.com/ajaxorg/ace/blob/master/lib/ace/worker/worker_client.js#L53,您可以使用 session.setOption("useWorker", false )禁用它“我试过这个,但它没有用。我进一步挖掘了代码并在ace.js

function createWorker(workerUrl) {
if (config.get("loadWorkerFromBlob")) {...}
}

所以我试图loadWorkerFromBlob通过调用设置为 false editor.session.setOption(...)ace但也没有。

this.editor.setOptions({
  readOnly: this.readonlyFormStatus,
  loadWorkerFromBlob:false
});

我收到错误misspelled option loadWorkerFromBlob

我还在弄清楚为什么。只是为了测试东西,我改变了option对象ace.js,然后我的测试用例开始工作。

var options = {
....
    loadWorkerFromBlob: false,

};

更新-

loadWorkerFromBlob 是一个全局选项,可以使用ace.config.set("loadWorkerFromBlob", false). 也许 useWorker 没有工作,因为它是在尝试创建工作者之后调用的。


推荐阅读