代码之家  ›  专栏  ›  技术社区  ›  Jeroen

如何在角2+量角器E2E测试之前进行AJAX调用?

  •  0
  • Jeroen  · 技术社区  · 7 年前

    我想在 beforeAll 角6 E2E试验。我试过各种方法,似乎都不管用。这是我的剧本的重演。

    ng new foobar (angular 6 cli)并进入该文件夹。打开 app.e2e-spec.ts 并在 describe 兰姆达:

    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 block,但是我似乎无法从浏览器范围之外的post调用中捕获要在测试中使用的结果。

    所以,我不知所措。在 以前 角6量角器端到端测试?

    1 回复  |  直到 7 年前
        1
  •  0
  •   Jeroen    7 年前

    经过一些很好的“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和dragor等待 callback 即将发生。

    注意,起初这种方法似乎不起作用,但后来我发现 回拨 但我的请求不正确导致 400 状态代码。我建议使用 this VSCode e2e debugging setup 如果你仍然有麻烦的话,去核实事情是否按预期进行。