Я пытаюсь автоматизировать некоторые службы REST с помощью SuperTest. Служба представляет собой вызов POST, который внутренне вызывает метод GET другой сторонней службы. Я пытаюсь издеваться над сторонними сервисами, чтобы повысить эффективность тестирования и сократить время его выполнения. Я использую нок, чтобы имитировать вызов сторонней службы.
Мой первоначальный звонок в службу поддержки выглядит так:
curl -X POST \
http://internal-url.com/path \
-H 'Content-Type: application/json' \
-H 'cache-control: no-cache' \
-d '{
"key1": "value1",
"key2": "value2"
}'
Эта служба делает вызов сторонней службе, которая выглядит так:
curl -X GET \
'http://3rdparty-url.com/value1' \
-H 'Content-Type: application/json' \
-H 'cache-control: no-cache' \
-H 'key2: value2'
Я издевался над сервисом, используя nock в beforeTest, например:
nock('http://3rdparty-url.com')
.get('/value1')
.reply(200, 'domain matched');
Когда я звоню напрямую в эту стороннюю службу с помощью SuperTest, она возвращает имитированный ответ. Однако моя цель - сделать вызов POST и перехватить вызов сторонней службы с помощью заглушки, чего не происходит. Я добился подобного в мире Java, используя WireMock. Можно ли это сделать с помощью nock?
Мой тест выглядит так -
var payload = {"key1": "value1", "key2": "value2"};
describe('Test third party Service', function () {
it('should return success on POST /path service', function (done) {
supertest('http://internal-url.com')
.post('/path')
.send(payload)
.expect(200)
.expect('Content-type', /application/json/)
.expect(function (response) {
console.info(response.body);
//test fails as third party server is not available and mock doesn't intercept
})
.end(done);
});
@MattR.Wilson - обновил тест
Какие шаги вы предприняли, чтобы убедиться, что запрос, отправляемый из вашего внутреннего приложения, идентичен запросу curl GET, который вы разместили выше? Кроме того, работает ли внутреннее приложение в том же процессе Node, что и тест?
@MattR.Wilson - я проверил журнал приложений, который показывает точный CURL, который я использую. Во-вторых, приложение и тесты выполняются в разных процессах Node. Может ли это быть проблемой?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Нок работает с помощью функций обезьяньего исправления из модулей Node http и https в памяти текущего процесса. Это означает, что вызовы Nock должны выполняться в том же процессе, что и тот, который делает запросы.
В вашем случае все, что запускает приложение для «internal-url.com», должно вызывать nock. Обычное соглашение с nock и supertest заключается в том, чтобы запускать экземпляр вашего внутреннего приложения в том же процессе, что и тесты. Примеры супертестов показывает, как это сделать с помощью такой среды, как Express.
Я думаю, что лучше дать некоторый контекст того, что вы имеете в виду, а не просто ссылки на URL. Что произойдет, если этот URL-адрес не работает или перестает существовать???♂️
Весь первый абзац представляет собой контекст, который отвечает на конкретный вопрос о Nock. Второй абзац должен был помочь направить OP в правильном направлении для их варианта использования, которым оказался Supertest. Поскольку этот вопрос не касался Супертеста, я намеренно не копировал/вставлял код из его файла readme, так как он не по теме.
Можно с nock и ваш пример правильный. Должно быть что-то еще неправильно настроено в ваших тестах. Может быть полезно включить код с помощью супертеста для вызова локального приложения.