Как интегрировать тестирование конечных точек api формата api /: id с помощью mocha и supertest - PullRequest
0 голосов
/ 20 июня 2019

Я пытаюсь провести интеграционное тестирование конечной точки API для возврата определенных пользовательских данных, прикрепив userId к конечной точке

В настоящее время я могу протестировать конечную точку, которая возвращает всех пользователей, однако, когда я пытаюсь написать тест для возврата определенных пользовательских данных, прикрепив идентификатор пользователя к маршруту, я просто заканчиваю тестированием маршрута, возвращая всех пользователей.

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 вместо этого api/users/:id

Ответы [ 2 ]

0 голосов
/ 20 июня 2019

Вот так мне удалось полностью решить проблему

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();
      });
  });
}
0 голосов
/ 20 июня 2019

Я думаю, что это не супер-проблема. Как насчет того, чтобы сделать тест асинхронным, потому что к тому времени, когда ваш тест делает запрос, идентификатор пользователя может быть неопределенным, поскольку он устанавливается после входа в систему. Попробуйте обновить свой код следующим образом (добавьте слова в звездочках):

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

});

...