Chai-http не проверяет второе утверждение, когда одно внутри одного запроса

#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
          });        
      });
  });
});