Пакт вышел с кодом 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 mock не запускается.

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

"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"
  }

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

РЕДАКТИРОВАТЬ: я запустил pact тесты с DEBUG флаг, и это журнал, сгенерированный:

3 ответа

Решение

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

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

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

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

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

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

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

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

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

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, и он запускает новый экземпляр фиктивного сервера, используя ruby, поскольку это язык, на котором он написан. Время от времени случается, что узел просто "теряет" отслеживать "экземпляр ruby ​​и не отключить его должным образом.

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

Другие вопросы по тегам