【发布时间】:2020-10-16 06:40:10
【问题描述】:
我需要将我的 Karma 测试结果发布到自定义 REST API。为了自动处理这个问题,我编写了一个自定义的 Karma 报告器。我正在尝试使用 run_complete 事件,以便在所有浏览器完成后进行 POST。但是,没有进行 HTTP 调用。
我使用 Axios 0.19.2 来执行实际的 HTTP 调用,但同样的事情发生在 node-fetch 上。测试由 Angular cli 通过ng test 运行。我的 Karma 配置很长,但除了拥有一百万个不同的记者和可能的浏览器配置之外,几乎是标准的。
这是我的onRunComplete 方法:
self.onRunComplete = function () {
var report = ... ; // logic to generate a JSON object, not relevant
var url = '...'; // the endpoint for the request
try {
console.log('Sending report to ' + url);
axios.post(url, report, {headers: {'Content-Type': 'application/json'}})
.then(function(response) {
console.log('Success!');
console.log(response);
})
.catch(function(error) {
console.log('Failure!');
console.log(error);
});
} catch (err) {
console.log('Error!');
console.log(err);
}
}
在测试运行结束时,它会向控制台写入“将报告发送到...”消息,然后立即结束。服务器根本没有收到请求。
我还尝试使用'inProgress'布尔标志和while循环添加显式阻塞,但这几乎只是让整个测试运行挂起,因为它永远不会完成。 (由于从未发出请求,'inProgress' 标志始终为真,我们从不点击 then/catch 承诺处理程序或 catch 块。)
我已经验证了 Axios POST 请求的工作原理,方法是获取 onRunComplete 的全部内容(如此处所示),将其放入自己的 JS 文件中,然后直接调用它。报告按预期记录。只有当我从 Karma 内部调用时,它才会以某种方式被阻塞。
因为 Karma 的文档几乎可以归结为“去看看其他人是如何做类似事情的!”我很难弄清楚如何让它发挥作用。在自定义报告器内部发生 HTTP 请求是否有技巧?为什么我的实现不起作用?
【问题讨论】:
-
我遇到了类似的问题,但使用的是实际浏览器(不在业力范围内)。我想在浏览器关闭时进行 http 调用(在 onbeforeunload 中)。但是发生的事情是当浏览器关闭时,它会取消所有 xhrs。为了避免这种情况,我使用了同步 xhr (stackoverflow.com/questions/59021445/…)。不确定这是否会对您有所帮助,但从您的描述来看,它似乎是相似的。
标签: karma-runner