Возможен ли другой ответ с той же областью действия и путем с другим заголовком аутентификации с помощью Nock?

Я использую сторонний API с /places конечной точкой, которая возвращает информацию о местах, где аутентифицированный пользователь имеет разрешения в виде JSON. Этот API использует JWT в качестве аутентификации, токен помещается в заголовок X-Auth-Token.

В моем проекте есть служба, которая аутентифицируется для этого стороннего API с несколькими учетными записями пользователей. Один из моих тестовых примеров - тестирование этой службы, так что /places вызывается дважды. Служба аутентифицируется в стороннем API и устанавливает токен на X-Auth-Token перед запросом /places.

Я пытался имитировать сторонний API следующим образом:

nock(apiUrl)
  .matchHeaders("x-auth-token", firstToken)
  .get(/places/)
  .reply(200, placeList1);
nock(apiUrl)
  .matchHeaders("x-auth-token", secondToken)
  .get(/places/)
  .reply(200, placeList2)

Но Нок выдает мне ошибку, что совпадения по запросу не найдено. Если я попробую

nock(apiUrl)
  .matchHeaders("x-auth-token", (value) => {
    console.log(value)
    return value === firstToken;
  })
  .get(/places/)
  .reply(200, placeList1);

Я вижу, что значение X-Auth-Token является правильным для одного из запросов, но конечная точка по-прежнему не соответствует.

Я делаю что-то неправильно? Или возможно даже иметь несколько запросов к одному и тому же пути одной и той же области с разными ответами с помощью Nock? Поскольку моя служба использует обещания, я не могу полагаться на порядок, в котором создаются запросы.

Я использую request-promise-native в своей службе и провожу тесты с Mocka.


person Masza    schedule 20.12.2017    source источник


Ответы (2)


Для тех, кто сталкивается с этим вопросом, вы, безусловно, можете получить разные ответы на одном и том же пути, используя цепочку носков.

Вы можете попробовать что-то вроде:

nock(apiUrl)
.matchHeaders("x-auth-token", firstToken)
.get(/places/)
.reply(200, placeList1)
.matchHeaders("x-auth-token", secondToken)
.get(/places/)
.reply(200, placeList2)
person Sarneet Kaur    schedule 26.06.2019

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

Чтобы сделать ошибку более явной и облегчить сопровождение тестов, вы можете рассмотреть возможность включения фиктивной функции в ваш вызов matchHeader(name, ()=>{}), чтобы значения можно было наблюдать как часть теста.

test('project authenticates multiple accounts', () => {
  const xAuthHeader = jest.fn(s => true);

  const scope = nock(apiUrl)
    .matchHeaders("x-auth-token", xAuthHeader)
    .get('/places/')
    .reply(200, placeList1)
    .get('/places/')
    .reply(200, placeList2);

  await myProject.authenticate()

  expect(xAuthHeader).toHaveNthReturnedWith(1,[firstToken]);
  expect(xAuthHeader).toHaveNthReturnedWith(2,[secondToken]);
});

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

person ejb    schedule 20.11.2020