如何在beforeAll中为Angular 2+量角器e2e测试进行Ajax调用?

时间:2018-06-27 08:46:30

标签: angular typescript protractor

我想在Angular 6 e2e测试的beforeAll中对我的API进行POST。我尝试了各种方法,但似乎都没有用。这是我的情景的再现。

ng new foobar(Angular 6 CLI)开始,然后进入该文件夹。打开app.e2e-spec.ts并将以下代码添加到describe lambda中:

let id: string;

beforeAll((done) => {
  fetch('https://example.org/my-api', { method: 'POST' })
    .then(r => r.json())
    .then(r => {
      id = r;
      done();
    })
    .catch(err => done(err));
});

我要执行上述操作的原因是因为我想通过我的API在数据库中插入一个测试主题,以便随后可以使用在以后的e2e测试中返回的ID。

不幸的是,这会导致错误:

  

失败:未定义获取

我也尝试了其他一些选择。首先,我尝试执行本机xhr,但随后出现错误:

  

失败:未定义XMLHttpRequest

第二,我尝试执行import { http } from 'https';,然后调用http.request(...)函数,但是由于VSCode已经抱怨

,所以预期失败
  

[ts]模块'“ https”'没有导出的成员'http'。

最后,我还尝试将fetch包裹在browser.executeAsyncScript(...) call块中,但是随后我似乎无法从浏览器范围之外的POST调用中捕获结果,以用于测试中

所以,我很茫然。在Angular 6量角器端到端测试的beforeAll中对我的API进行Ajax POST的一种好方法是什么?

1 个答案:

答案 0 :(得分:0)

经过一些好的'ole橡皮鸭调试,我找到了解决方案:

beforeAll((done) => {
  const request = require('request');

  const options = {
    url: 'https://example.org/my-api',
    method: 'POST',
    headers: { 'Content-Type': 'application/json', },
    json: true,
    body: { key: 'dummy value' },
  };

  const callback = (error, response, body) => {
    if (!error && response.statusCode > 200 && response.statusCode < 300) {
      id = body;
      done();
    } else {
      done(error);
    }
  };

  request(options, callback);
});

关键要点在于,此代码是在 Node.js 上下文中执行的,并且到达Node.js库以执行Ajax调用的方式是const request = require('request');(或与http类似)。

done(...)调用(以及您需要在lambda中将其作为参数的事实)使Jasmine和Protractor等待callback发生。

请注意,起初这种方法似乎不起作用,但是后来我发现调用了callback,但是我的请求不正确,导致了状态为400。如果您仍然遇到问题,建议您使用this VSCode e2e debugging setup来验证事情是否按预期进行。