【问题标题】:Unable to make HTTP Post from custom Karma reporter无法从自定义 Karma 报告器进行 HTTP 发布
【发布时间】: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


【解决方案1】:

看起来发布请求是异步发出的 - 即发出请求并且控制几乎立即恢复到完成的方法...尝试改为:

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);
    await axios.post(url, report, {headers: {'Content-Type': 'application/json'}})
   ...
 }
}

【讨论】:

  • 不,根本没有发出post请求。无论我是等待还是链接承诺,它都不会执行。 'post' 之后的日志语句永远不会执行——如果它是异步执行的,就会出现这种情况。我还提到了在请求进行时使用“进行中”来阻止,它无限期地循环,因为问题是根本没有发出 HTTP 帖子。
  • 在请求中添加拦截器怎么样? axios.interceptors.request.use(config => { console.log('Request sent'); return config; }, error => { return Promise.reject(error);}); 到请求之前的行。如果这成功记录了控制台消息,您将看到日志消息。如果没有,您可能会知道您尝试的请求有什么问题?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多