我已经使用supertest
实现了在用户登录后运行的测试:
// ../prepare.login
"use strict";
import {default as request} from "supertest";
import {default as app} from "../../server.js";
const postUrl = "/api/v1/login";
const postData = {
"username": "user",
"password": "pass"
};
module.exports = {
prepare: function(done) {
request(app.listen())
.post(postUrl)
.send(postData)
.end((err, res) => {
if (err) {
throw err;
}
module.exports.token = res.body.token;
done();
});
}
}
到目前为止,我使用es5并使用module.exports.token
作为丑陋的黑客将令牌发送到实际测试:
// users.js
...
var login = require("../prepare.login");
describe("authenticated /api/v1/users", function() {
beforeEach(function(done) {
login.prepare(done);
});
});
...
it("On GET /api/v1/users I want to get all the users in an array", function(done) {
request(app.listen())
.get("/api/v1/users")
.set("X-Access-Token", login.token)
.expect(200)
...
我切换到es6,它不允许import
和export
语句在除模块顶层之外的任何地方。因此,我不确定应该如何实施。我应该异步等待结果吗?它甚至可能吗?还有其他办法吗?
答案 0 :(得分:0)
es6不允许导入和导出statemens,而不是模块的顶层
是的,但这只是变量声明需要的地方。您仍然可以随意分配给他们。
import {default as request} from "supertest";
import {default as app} from "../../server.js";
const postUrl = "/api/v1/login";
const postData = {
"username": "user",
"password": "pass"
};
export let token = null;
export function prepare(done) {
request(app.listen())
.post(postUrl)
.send(postData)
.end((err, res) => {
if (err) return done(err);
token = res.body.token;
done();
});
}
import {prepare, token} from "prepare.login";
…
还有其他办法吗?
是。您应该将token
传递给回调,而不是改变全局变量(自年龄以来被鄙视):
…
.end((err, res) => {
if (err) done(err);
else done(null, res.body.token);
});
以便您可以在需要的地方提取它:
let token = null;
describe("authenticated /api/v1/users", function() {
beforeEach(function(done) {
login.prepare(function(err, t) {
if (err) return done(err);
token = t;
done();
});
});
});
还有更好的方法吗?
与第二种方法类似,不要使用导出的变量;但不是调用繁琐的回调,而只是返回令牌的承诺。