В Nock, URL мне кажется нормальным, но не совпадает - PullRequest
0 голосов
/ 12 марта 2020

Я пытаюсь использовать nock для перехвата вызова из моего приложения на inte rnet.

Цель здесь - избежать использования переменного внешнего API при тестировании.

Что Я делаю это:

describe('My awesome test', () => {
    beforeEach(() => {
        let scope = nock('http://www.myexternalapi.eu')
            .log(console.log)
            .post('/my/awesome/path')
            .query(true)
            .reply(200, response);

        console.error('active mocks: %j', scope.activeMocks())
    });

    it('Should try to call my API but return always the same stuff ', () =>{
            myService.doStuffWithAHttpRequest('value', (success) => {
               // The answer must always be the same !
               console.log(success);
            });
    })

  // Other tests...

}

и myService.doStuffWithAHttpRequest ('value', (success) выглядит примерно так:

    const body = "mybodyvalues";

    const options = {
        hostname: 'myexternalapi.eu',
        path: '/my/awesome/path',
        method: 'POST',
        headers: {
            'Content-Type': 'application/xml'
        }
    };

    const request = http.request(options, (response) => {
        let body = "";
        response.setEncoding('utf8');
        response.on('data', data => {
           body += data;
        });
        response.on('end', () => {
            parser.parseString(body, (error, result) => {
                // Do a lot of cool stuff
                onSuccess(aVarFromAllTheCoolStuff);
            });
        });
    });

При запуске моих тестов nock отображает это:

active mocks: ["POST http://www.myexternalapi.eu:80/my/awesome/path/"]

Кажется, хорошо! Но мой запрос не совпадает, и внешний API всегда вызывается!

Я пробовал:

    beforeEach(() => {
        let scope = nock('http://www.myexternalapi.eu/my/awesome/path')
            .log(console.log)
            .post('/')
            .query(true)
            .reply(200, response);

        console.error('active mocks: %j', scope.activeMocks())
    });

Это тоже не работает.

    beforeEach(() => {
        let scope = nock('myexternalapi.eu')
            .log(console.log)
            .post('/my/awesome/path')
            .query(true)
            .reply(200, response);

        console.error('active mocks: %j', scope.activeMocks())
    });

Это тоже не работает и отображает странный URL:

active mocks: ["POST null//null:443myexternalapi.eu:80/my/awesome/path/"]

Плюс что-то странное:

Nock can log matches if you pass in a log function like this:

    .log(console.log)

Не отображать ничего .. .?! Есть идеи?

Спасибо, я схожу с ума от этого ...

1 Ответ

0 голосов
/ 12 марта 2020

Значения, которые вы предоставляете для nock и post, не совсем верны. Попробуйте это.

let scope = nock('http://www.myexternalapi.eu')
    .log(console.log)
    .post('/my/awesome/path')
    .reply(200, response);

Строковый аргумент, передаваемый nock, должен быть источником, хостом и протоколом и не должен содержать пути или параметров поиска / информации запроса. Аналогично, метод post должен получить путь вызова.

Один полезный инструмент при попытке определить, почему Nock не соответствует запросу, заключается в debug, который Nock имеет встроенную . Итак, как бы вы ни выполняли свои тесты, добавьте DEBUG=nock*.

...