如何使用Mocha和Supertest集成测试'api /:id'格式的api端点

时间:2019-06-20 08:05:27

标签: express mocha supertest

我正在尝试通过将userId附加到端点来对API端点进行集成测试,以返回特定的用户数据

我目前能够测试返回所有用户的端点,但是当我尝试编写将用户的ID附加到路由上以返回特定用户数据的测试时,我最终测试了返回所有用户的路由。

sort=query($manu_sort,0) desc, query($seller_sort,0) desc, ManufacturerName asc
&manu_sort=ManufacturerName:Champ
&seller_sort=BestSeller:true

我希望该测试能够通过,但不幸的是,它并不仅仅是保持击中describe('User profile route', () => { let token = ''; let userId = ''; let userId1 = ''; useInTest(); it('should return a specific user details', (done) => { signUp(mockData.signUpData).expect(201) .end(() => {}); signUp(mockData.signUpData1).expect(201) .end(() => {}); login(mockData.loginData) .expect(200) .end((err, res) => { token = res.body.accessToken; userId = res.body.user._id; }); agent.get(`/api/users/${userId1}`).set('Authorization', 'Bearer ' + token) .expect(200) .end((err, res) => { console.log(res.body); res.body.should.have.length(1); done(); }) }); } 而不是击中api/users

2 个答案:

答案 0 :(得分:0)

我认为这不是一个超级问题。如何使测试异步,因为到您的测试发出请求时,由于userId是在登录后设置的,因此它可能是未定义的。尝试像这样更新您的代码(在星号中添加单词):

it('should return a specific user details', **async**(done) => {
signUp(mockData.signUpData).expect(201)
  .end(() => {});
signUp(mockData.signUpData1).expect(201)
  .end(() => {});
**await** login(mockData.loginData)
  .expect(200)
  .**then**((err, res) => {
    token = res.body.accessToken;
    userId = res.body.user._id;
  });

agent.get(`/api/users/${userId1}`).set('Authorization', 'Bearer ' + token)
  .expect(200)
  .end((err, res) => {
    console.log(res.body);
    res.body.should.have.length(1);
    done();
  })

});

答案 1 :(得分:0)

这是我设法完全解决问题的方式

describe('User profile route', () => {

  let token = '';
  let userId = '';
  let userId1 = '';
  useInTest();
  beforeEach( async () => {
    signUp(mockData.signUpData).end(() => {});
    signUp(mockData.signUpData1).end(() => {});
    await login(mockData.loginData)
      .then((res) => {
        token = res.body.accessToken;
        userId = res.body.user._id;
      });
    await login(mockData.loginData1)
      .then((res) => {
        userId1 = res.body.user._id;
      });
  });

  it('should return user profile for the currently logged in user', (done) => {
    agent.get('/api/users/' + userId).set('Authorization', 'Bearer ' + token)
      .end((err, res) => {
        res.body.should.have.property('name', 'Arnold');
        done();
      });
  });
}