Запуск Jest в Electron и использование --inspect-brk - PullRequest
0 голосов
/ 25 октября 2019

Я пытаюсь заставить Jest работать в среде Electron (а не в Node), он работает, как и ожидалось, когда я запускаю Electron, следующим образом:

$ node_modules/.bin/electron node_modules/.bin/jest
 PASS  src/index.spec.ts
  index
    ✓ should export a type named: `C` (2ms)
    ✓ can change X via `setX` and retrieve X using `getX`

----------|----------|----------|----------|----------|-------------------|
File      |  % Stmts | % Branch |  % Funcs |  % Lines | Uncovered Line #s |
----------|----------|----------|----------|----------|-------------------|
All files |      100 |      100 |      100 |      100 |                   |
 index.ts |      100 |      100 |      100 |      100 |                   |
----------|----------|----------|----------|----------|-------------------|
Test Suites: 1 passed, 1 total
Tests:       2 passed, 2 total
Snapshots:   0 total
Time:        1.912s
Ran all test suites.

Однако, когда я пытаюсь запустить Electron с отладкойвключен, Jest не может обнаружить какой-либо из модульных тестов:

$ node_modules/.bin/electron --inspect-brk node_modules/.bin/jest
Debugger listening on ws://127.0.0.1:9229/16848549-d2de-4798-815c-5475156c961e
For help, see: https://nodejs.org/en/docs/inspector

В этот момент я использую chrome://inspect для присоединения сеанса отладчика Node, сеанс приостанавливается в отладчике, и как только я нажимаю кнопку ВозобновитьПри нажатии кнопки выполнения скрипта появляется следующий вывод:

Debugger attached.
No tests found, exiting with code 1
Run with `--passWithNoTests` to exit with code 0
In /Users/cdivilly/work/ts/TypeScript-Babel-Starter-master
  12 files checked.
  testMatch: **/__tests__/**/*.[jt]s?(x), **/?(*.)+(spec|test).[tj]s?(x) - 1 match
  testPathIgnorePatterns: /node_modules/ - 12 matches
  testRegex:  - 0 matches
Pattern: node_modules/.bin/jest - 0 matches
Waiting for the debugger to disconnect...
  • На этот раз Jest не может найти какие-либо модульные тесты.
  • Почему добавление --inspect-brk меняет поведение Jest?

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

$ node --inspect-brk node_modules/.bin/jest
Debugger listening on ws://127.0.0.1:9229/60902f16-acac-442a-a82c-40c9e0fd4857
For help, see: https://nodejs.org/en/docs/inspector
Debugger attached.
 PASS  src/index.spec.ts
...

Если я использую --inspect вместо --inspect-brk, который завершается таким же образом:

$ node_modules/.bin/electron --inspect node_modules/.bin/jest
Debugger listening on ws://127.0.0.1:9229/4a003d44-d958-4e4c-b8d5-b0ff5db29ce4
For help, see: https://nodejs.org/en/docs/inspector
No tests found, exiting with code 1
Run with `--passWithNoTests` to exit with code 0
In /Users/cdivilly/work/ts/TypeScript-Babel-Starter-master
  12 files checked.
  testMatch: **/__tests__/**/*.[jt]s?(x), **/?(*.)+(spec|test).[tj]s?(x) - 1 match
  testPathIgnorePatterns: /node_modules/ - 12 matches
  testRegex:  - 0 matches
Pattern: node_modules/.bin/jest - 0 matches

Так что, похоже, именно эта точка пересечения времени выполнения Electron, Jest и включения отладки вызывает эту проблему.

Для справки приведен исходный код моего примера, который взят из TypeScript-Babel-Starter . Я пишу свой код и тесты в Typescript и использую ts-jest в качестве предустановки Jest.

package.json

{
  "name": "babel-typescript-sample",
  "version": "0.7.1",
  "license": "MIT",
  "scripts": {
    "type-check": "tsc --noEmit",
    "type-check:watch": "npm run type-check -- --watch",
    "build": "npm run build:types && npm run build:js",
    "build:types": "tsc --emitDeclarationOnly",
    "build:js": "babel src --out-dir lib --extensions \".ts,.tsx\" --source-maps inline",
    "test": "jest"
  },
  "devDependencies": {
    "@babel/cli": "^7.2.3",
    "@babel/core": "^7.4.0",
    "@babel/plugin-proposal-class-properties": "^7.4.0",
    "@babel/plugin-proposal-numeric-separator": "^7.2.0",
    "@babel/plugin-proposal-object-rest-spread": "^7.4.0",
    "@babel/preset-env": "^7.4.1",
    "@babel/preset-typescript": "^7.3.3",
    "@types/jest": "^24.0.19",
    "electron": "6.1.1",
    "jest": "^24.9.0",
    "ts-jest": "^24.1.0",
    "typescript": "^3.3.3"
  }
}

jest.config.js

module.exports = {
  preset: 'ts-jest',
  testEnvironment: 'node',
  collectCoverage: true
};

index.spec.ts

import * as index from './index'

describe('index', () => {
    it('should export a type named: `C`',() => {
     expect(typeof index.C).toBe('function')
    })
    it('can change X via `setX` and retrieve X using `getX`',() => {
        let c = new index.C();
        expect(c.getX()).toBe(10)
        c.setX(20)
        expect(c.getX()).toBe(20)
    })
})

index.ts

export class C {
    private x = 10
    getX = () => this.x;
    setX = (newVal: number) => { this.x = newVal; }
}

export let x = new C();
export let y = { ...{ some: "value" } }

1 Ответ

1 голос
/ 25 октября 2019

К сожалению, я не могу предоставить реальное решение вашей проблемы, но я думаю, что я изучил ее причину: См. Конец ответа для обходного пути.

Исполняемый файл Node.js скрывает егопараметры из исполняемого файла JS. Поэтому, если вы запустите node --inspect file.js, массив process.argv будет иметь значение ['/path/to/node', '/path/to/file.js'], где нигде не появится флаг --inspect.

Электрон, однако, не будет делать то же самое. Массив process.argv отличается между node_modules/.bin/electron file.js и node_modules/.bin/electron --inspect file.js.

Jest, похоже, принимает все аргументы начиная с третьего и использует их как свои собственные параметры. Это означает, что когда вы запускаете node_modules/.bin/electron --inspect node_modules/.bin/jest, Jest будет использовать аргумент node_modules/.bin/jest в качестве шаблона тестового файла - и не найдет ничего подходящего. Вот почему ваш тестовый вывод сообщает: Pattern: node_modules/.bin/jest - 0 matches.

РЕДАКТИРОВАТЬ:

Я нашел ужасно не элегантный обходной путь, но это решает проблему.

Вы можете создать «прокси» файл, который удалит аргумент --inspect из process.argv и запустить ваши тесты через него:

// test.js
if (['--inspect', '--inspect-brk'].includes(process.argv[1])) {
  process.argv.splice(1, 1)
}

require('./node_modules/.bin/jest')

Запуск electron test.js успешно выполнит Jest тесты, electron --inspect test.jsсделай так же. Поскольку сам бинарный файл Electron не зависит от выполняемого им скрипта, он все равно найдет флаг --inspect и перейдет в режим отладки.

...