如何让 mocha 在进入下一个测试之前等待

How to make mocha wait before moving to the next test

When i ran npm test i got a 'TypeError [ERR_HTTP_INVALID_HEADER_VALUE]: Invalid value "undefined" for header "x-access-token"' error. Seems like mocha moves on to the second test before getting the token. I tried adding a delay with the setTimeOut method but i still got the above error.

 // creates valid-user object
    const validUser = {
      username: 'Rigatoni',
      email: 'yahoo.com',
      password: 'qwerty1234567',
    };
    describe('Post Tests', () => {
      // login and get token...
      let token;
      before((done) => {
        request(app)
          .post('/api/v1/auth/login')
          .send(validUser)
          .end((err, res) => {
            // eslint-disable-next-line prefer-destructuring
            token = res.body.token;
            console.log('token', token);
            expect(res.status).to.equal(200);
          });
        // console.log('token test');
        done();
      });

      describe('GET all posts', () => {
        it('should return all posts', (done) => {
          request(app)
            .get('/api/v1/posts')
            .set('x-access-token', token)
            .end((err, res) => {
              expect(res.body.success).to.equal(true);
            });
          done();
        });
      });
    });

你的测试几乎是正确的!

提供 done 回调是为了让 Mocha 知道何时可以继续。但是,您在 调用异步 request 方法之后 调用 done() ; Mocha 认为测试在您发出请求之前就已经完成了。

将每个测试的 done() 调用移动到回调函数中(例如,在 expect() 之后的行中),以便在请求完成后才执行。然后Mocha会等到测试结束再继续。

示例:

request(app)
        .get('/api/v1/posts')
        .set('x-access-token', token)
        .end((err, res) => {
          expect(res.body.success).to.equal(true);
          done();
        });