Тестирование elasticsearch с nock в nodejs

  1. Задействуйте API в реальном времени, но только отключите сервисный уровень (т.е.) запрос эластичного поиска к базе данных, скажем, (localhost:9200//). Как я могу обратиться к API, но только перехватить запрос elasticsearch к базе данных?

  2. У меня есть несколько слоев, таких как уровень API и уровень обслуживания, а также уровень базы данных в моем проекте. Поэтому я использовал nock для имитации запросов на уровне API. Но я в основном хочу издеваться над данными, присутствующими на уровне сервиса elasticsearch, на уровне базы данных. Другими словами, уровень API должен работать с реальными обращениями, а уровень elasticsearch должен быть только отсканирован. Ожидаемый результат — это только имитация уровня elasticsearch, а не всего запроса и ответа API. Это фрагмент, который я использовал для имитации запроса и ответа на уровне API.

    it('should return a user', () => {    
          nock('https://randomuser.me')
            .get('/myapi/')
            .reply(200, {
              results: [{ name: 'Dovahkiin' }],
            });
          return query
            .getQueryRequest()
            .then(res => res.results[0].name)
            .then(res => expect(res).toEqual('Dovahkiin'));
        });
    

person Dovabornn    schedule 24.08.2019    source источник
comment
Что происходит, когда вы пытаетесь «nock(localhost:9200)...'? Он должен работать.   -  person Matt R. Wilson    schedule 24.08.2019
comment
SO преобразует этот источник и удаляет протокол при его рендеринге, но вам нужно включить бит «http://»   -  person Matt R. Wilson    schedule 24.08.2019
comment
@MattR.Wilson Спасибо за ответ, но я хочу, чтобы обращения к API были реальными, а имитировались только запросы elasticsearch. Можно ли все это инкапсулировать в нок? Если да, то как я могу этого достичь?   -  person Dovabornn    schedule 24.08.2019


Ответы (2)


Похоже, проблема связана с попыткой взломать локальный хост, он блокирует и/или имитирует другие запросы локального хоста, которые не направляются на порт 9200.

Если у меня есть на это право, вы можете использовать allowUnmocked< Параметр /a> при создании области nock вокруг локального хоста.

Из документов:

Если вам нужно, чтобы какой-то запрос с одним и тем же именем хоста был имитирован, а некоторые другие действительно проходили через стек HTTP, вы можете использовать параметр allowUnmocked.

  nock('https://localhost:9200', { allowUnmocked: true })
    .get('/somepath')
    .reply(200, {
      results: [{ name: 'Dovahkiin' }],
    });
person Matt R. Wilson    schedule 25.08.2019
comment
Удивительно, но это не сработало для меня. Я хочу, чтобы все остальные вызовы, кроме вызова elasticsearch, были реальными запросами к серверу. Но я использовал chai-http для интеграции с nock, но тщетно. Есть ли другой способ, с помощью которого я могу интегрировать запросы реального сервера с nock? - person Dovabornn; 27.08.2019
comment
@Dovabornn, вы можете отредактировать свой вопрос, чтобы предоставить больше примеров того, как ваш тест настроен и запущен. А у тебя ошибки не появляются? Также вы часто ссылаетесь на уровень API, вы имеете в виду сервер, который получает запросы в вашем приложении, или сторонний API, с которым взаимодействует ваше приложение? - person Matt R. Wilson; 27.08.2019

Порядок, в котором вы импортируете Nock, может сыграть важную роль. Например, у меня было следующее в моем собственном наборе:

const API = require('api')
const Nock = require('nock')

Моему API-модулю требовался Elasticsearch, и я не мог заставить Nock перехватывать запросы, которые делал модуль elasticsearch-js. Однако, после простого изменения порядка импорта, мой тест работал, как и ожидалось, поскольку Nock нужно переопределить http.request и http.ClientRequest до того, как библиотеки, которые их используют, будут запущены.

Надеюсь это поможет!

person Ryan Miller    schedule 16.11.2019