我想在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的一种好方法是什么?
答案 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来验证事情是否按预期进行。