#node.js #mocha.js #chai #chai-http
#node.js #mocha.js #chai #chai-http
Вопрос:
Я пытаюсь получить свою переменную токена из /signing, чтобы предоставить ее маршруту изменения имени. Но утверждение не всегда срабатывает. Может ли быть какой-либо лучший способ сделать это? Могу ли я использовать async-await для решения этой проблемы, если да, то как?
describe("setName", function (done) {
it("/POST user setName", function (done) {
Users.remove({}, (err) => {
console.log(chalk.bgBlue(`Removing User`));
// done();
});
let user = {
"email": "tiwari.ai.harsh@gmail.com",
"password": "password",
"name": "Harsh Tiwari"
}
var requester = chai.request(app).keepOpen()
requester.post("/api/users/signin").send({
user
}).end((err_signin, res_signin) => {
let token = res_signin.body.user.token;
let name = "Name Changed"
requester.post("/api/users/setName").set({ authorization: `Token ${token}` }).send({
name
}).end((err, res) => {
res.should.have.status(200); <--------------------------- This is not working
});
done()
});
});
});
Комментарии:
1. Похоже, вы звоните
done()
по первому запросу. Таким образом, тест существует до завершения запросаsetName
. Переместите его после утверждения, которое не всегда выполняется.
Ответ №1:
Текущий код будет выполняться done
до requester.post("/api/users/setName")
завершения, потому что это асинхронное выполнение.
Чтобы решить проблему, done()
следует указать после res.should.have.status(200);
describe('setName', function (done) {
// NOTE: I also moved remove function here to ensure user is removed correctly
before(function(done) {
Users.remove({}, (err) => {
console.log(chalk.bgBlue(`Removing User`));
done(); // NOTE: also specify done to tell mocha that async execution is finished
});
})
it('/POST user setName', function (done) {
let user = {
email: 'tiwari.ai.harsh@gmail.com',
password: 'password',
name: 'Harsh Tiwari',
};
var requester = chai.request(app).keepOpen();
requester
.post('/api/users/signin')
.send({
user,
})
.end((err_signin, res_signin) => {
let token = res_signin.body.user.token;
let name = 'Name Changed';
requester
.post('/api/users/setName')
.set({ authorization: `Token ${token}` })
.send({
name,
})
.end((err, res) => {
res.should.have.status(200);
done(); // NOTE: move here
});
});
});
});