Пакт расторгнут с кодом 1

Я пытаюсь выполнить некоторые тесты с библиотекой Pact и получаю некоторые ошибки. Вот тестовая конфигурация:

const path = require('path');
const Pact = require('pact');
const expect = require('expect.js');
const config = require('../../../src/server/config');
const service = require('../../../src/routes/interactions/interactions.service');

describe('@component/interactions tests', () => {
    const url = 'http://localhost';
    const port = 8989;

    const provider = Pact({
        port: port,
        log: path.resolve(process.cwd(), 'test/component/interactions/log/interactions-pact.log'),
        dir: path.resolve(process.cwd(), 'test/component/interactions/pacts'),
        spec: 2,
        consumer: 'cx_issue',
        provider: 'interaction',
        // logLevel: 'WARN'
    });

    config.settingsToExport.INTERACTION_URL = `${url}:${port}`;

    before(done => {
        provider.setup()
            .then(() => {
                done();
            })
            .catch(err => {
                done(err);
            });
    });

    after(done => {
        provider.finalize()
            .then(() => {
                done();
            })
            .catch(err => {
                done(err);
            });
    });

    describe('#createInteraction', () => {
        before(done => {
            const INTERACTION_BODY = {
                contact: 'contact1'
            };
            const TERM = {
                generate: '0dae5b93-9451-4b08-b7bb-f0b944fbcdf2',
                matcher: '^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$'
            };

            const pactInteractionCreate = {
                state: 'Creates a new interaction',
                uponReceiving: 'a new interaction is created successfully',
                withRequest: {
                    method: 'POST',
                    path: '/interactions',
                    body: INTERACTION_BODY
                },
                willRespondWith: {
                    status: 201,
                    body: {
                        id: Pact.Matchers.term(TERM)
                    }
                }
            };

            const promises = [
                provider.addInteraction(pactInteractionCreate)
            ];
            Promise.all(promises)
                .then(() => {
                    done();
                });
        });

        it('/api/interactions POST', done => {

            const interaction = {
                contact: 'The xx'
            };

            service.createInteraction(interaction)
                .then(response => {
                    expect(response.id).to.be.equal(TERM.generate);
                    done();
                })
                .catch(done);
        });
    });
});

Это содержимое моего файла package.json со всеми установленными зависимостями:

{
  "name": "issueAPI",
  "version": "1.0.0",
  "private": true,
  "main": "./src/index.js",
  "scripts": {
    "dev": "nodemon -e  js ./src/index.js",
    "start": "node ./src/index.js",
    "linter": "node ./node_modules/eslint/bin/eslint.js ./src",
    "test": "mocha test",
    "test-component": "mocha test/component",
    "install-test-build": "npm install && npm test && npm run linter",
    "test-build": "npm test && npm run linter"
  },
  "jshintConfig": {
    "esversion": 6
  },
  "dependencies": {
    "ajv": "^4.11.3",
    "body-parser": "^1.17.2",
    "express": "^4.15.3",
    "express-winston": "^2.4.0",
    "request": "^2.81.0",
    "winston": "^2.3.1",
    "yamljs": "^0.2.9"
  },
  "devDependencies": {
    "@pact-foundation/pact-node": "^4.8.3",
    "dotenv": "^4.0.0",
    "eslint": "^4.2.0",
    "eslint-config-node": "^1.6.0",
    "expect.js": "^0.3.1",
    "mocha": "^3.2.0",
    "nodemon": "^1.11.0",
    "pact": "^2.3.3",
    "sinon": "^2.3.8",
    "supertest": "^3.0.0"
  }
}

И это ошибка, которую я получаю: введите здесь описание изображения

В принципе, сейчас меня совершенно не волнует, хорошие анализы или нет. Основная проблема сейчас заключается в том, что фиктивный сервер пакта не запускается.

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

"dependencies": {
    "ajv": "^4.11.3",
    "body-parser": "^1.16.1",
    "dotenv": "^4.0.0",
    "express": "^4.14.0",
    "jsonwebtoken": "^7.4.1",
    "jwt-simple": "^0.5.1",
    "morgan": "^1.8.1",
    "mustache-express": "^1.2.4",
    "node-env-file": "^0.1.8",
    "request": "^2.79.0",
    "when": "^3.7.8"
  },
  "devDependencies": {
    "@pact-foundation/pact-node": "^4.8.3",
    "eslint": "^3.17.1",
    "eslint-config-node": "^1.6.0",
    "expect.js": "^0.3.1",
    "mocha": "^3.2.0",
    "nodemon": "^1.11.0",
    "pact": "^2.3.3",
    "sinon": "^1.17.7",
    "supertest": "^3.0.0",
    "nock": "^9.0.13"
  }

Что происходит с этой ситуацией?

EDIT: я запустил тесты pact с флагом DEBUG, и это сгенерированный журнал: введите здесь описание изображения введите здесь описание изображения


person christiansr85    schedule 14.07.2017    source источник
comment
Мне интересно, относится ли это к github.com/pact-foundation/pact- js/проблемы/64?   -  person Matthew Fellows    schedule 17.07.2017


Ответы (3)


Судя по коду завершения 1, похоже, что сервер не может правильно запуститься. Это может быть конфликт портов на порту 8989, так что это стоит проверить.

Это может быть связано с https://github.com/pact-foundation/pact-js/issues/64 (длина путей к файлам Windows ограничена).

Не могли бы вы включить DEBUG ведение журнала с помощью logLevel: 'DEBUG' и следить за тем, что он выводит, а также поделиться любым *.log файлом. Это может быть аргумент неправильного форматирования при запуске сервера.

Как вы заметили, он не может запустить базовый процесс Ruby, поэтому нам нужно разобраться в этом.

person Matthew Fellows    schedule 16.07.2017
comment
Я запустил тесты с журналами DEBUG и отобразил результаты в вопросе. Файл журнала не создается, так что это вся информация, которая у меня есть. Я думаю, что это не конфликт портов, потому что, если я выполняю пакт-тест в другом проекте, он работает нормально, но в этом он всегда выдает эту ошибку, даже если я меняю номер порта. - person christiansr85; 17.07.2017
comment
Да! Это была проблема с длиной пути ... но я был сбит с толку, потому что не видел в журнале консоли пути, превышающего 260 символов. Во всяком случае, я скачал проект по более короткому пути, и сервер запустился. - person christiansr85; 17.07.2017
comment
@christiansr85 интересно. Не могли бы вы тогда ответить на свой вопрос? Это может быть полезно для других. - person J_A_X; 18.07.2017
comment
@matthew-fellows Это со стороны Ruby или со стороны узла? - person J_A_X; 18.07.2017

Наконец, после ответа @Matthew Fellows и прочтения его ссылки на https://github.com/pact-foundation/pact-js/issues/64, я переместил свой проект на более короткий путь, аналогичный D:\myproject\, а затем был запущен фиктивный сервер pact, и мои тесты были пройдены. Поэтому, пока не будет найдено лучшее решение, я буду работать в этом каталоге с коротким путем, чтобы избежать новых проблем.

Пожалуйста, прочитайте предыдущую ссылку, чтобы получить больше информации об этой ошибке, потому что она очень хорошо объяснена.

person christiansr85    schedule 18.07.2017

Мне кажется, что сервер не запускается должным образом, обычно это связано с тем, что порт уже используется. Чтобы проверить, так ли это, в командной строке вашего узла (в cmd введите node, чтобы перейти к командной строке узла), скопируйте/вставьте следующее:

require('http').createServer(function(){}).listen(11108);

Функция «прослушивания» принимает номер порта, который я взял с вашего скриншота. Посмотрите, что выводит узел; я предполагаю, что это покажет что-то вроде этого:

Error: listen EADDRINUSE :::11108
    at Object.exports._errnoException (util.js:1018:11)
    at exports._exceptionWithHostPort (util.js:1041:20)
    at Server._listen2 (net.js:1258:14)
    at listen (net.js:1294:10)
    at Server.listen (net.js:1390:5)
    at repl:1:44
    at sigintHandlersWrap (vm.js:22:35)
    at sigintHandlersWrap (vm.js:73:12)
    at ContextifyScript.Script.runInThisContext (vm.js:21:12)
    at REPLServer.defaultEval (repl.js:340:29)

Это означает, что на самом деле существует конфликт портов. Посмотрите в свой диспетчер задач и убедитесь, что в фоновом режиме нет экземпляров узлов, которые могут мешать вашим тестам запускать новый сервер. Вы также можете проверить наличие запущенных версий ruby.exe; к сожалению, нам приходится упаковывать ruby.exe с pact-node, и он запускает новый экземпляр mock-сервера, используя ruby, так как это язык, на котором он написан. Время от времени случается, что node просто «теряет track" экземпляра ruby ​​и не отключает его должным образом.

Это хорошо известная нам проблема, которую мы активно пытаемся исправить, объединяя весь код базового пакта в единую общую библиотеку, которую можно использовать на всех языках и операционных системах без необходимости запуска дополнительного экземпляра. . Пожалуйста, потерпите нас, пока мы избавимся от некоторых из этих перегибов :)

person J_A_X    schedule 15.07.2017
comment
Если это конфликт портов, не будет ли конфликт на порту 8989? 11108 выглядит как PID. - person Matthew Fellows; 16.07.2017
comment
@J_A_X, как указал Мэтью, порт 8989, а 11108 — это внутренний PID, сгенерированный Pact, который отличается при каждом выполнении тестов. Во всяком случае, я попытался также изменить номер порта, и у меня все еще та же проблема. - person christiansr85; 17.07.2017