Как проверить код, который зависит от библиотеки? - PullRequest
1 голос
/ 27 октября 2019

Я создал библиотеку mylib, которая скомпилирована со следующим разделом веб-пакета:

output: {
    ...
    library: 'mylib',
    libraryTarget: "var",
    libraryExport: 'default',
},

, чтобы его можно было включить в тег сценария и использовать напрямую, например:

<script src="mylib.js"></script>
<script>
    mylib.foo();  // the name mylib is available
</script>

В новом приложении я хотел бы построить на mylib (./src/point.js):

export class Point extends mylib.Widget {
    constructor(x, y) {
        super();
        this.x = x;
        this.y = y;
    }
}

и использовать jest для написания модульных тестов (./src/__tests__/test-point.js):

import {Point} from "../point";

test("test-point", () => {
    const p = new Point(5, 10);
    expect(p.x).toBe(5);
    expect(p.y).toBe(10);
});

конечно jest жалуется, что не знает, что такое mylib:

(dev) go|c:\srv\lib\dkface> jest
 FAIL  src/__tests__/test-point.js
  ● Test suite failed to run

    ReferenceError: mylib is not defined

      1 |
    > 2 | export class Point extends mylib.Widget {
        |                            ^
      3 |     constructor(x, y) {
      4 |         super();
      5 |         this.x = x;

      at Object.mylib (src/point.js:2:28)
      at Object.<anonymous> (src/__tests__/test-point.js:2:1)

Test Suites: 1 failed, 1 total
Tests:       0 total
Snapshots:   0 total
Time:        4.313s
Ran all test suites.

Я немного ошеломлен конфигурациями webpack / babel / jest и этимЯ только второй раз использую Jest (первый был на mylib, где он отлично работает). Как мне заставить это работать?

1 Ответ

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

Поскольку вы ожидаете, что mylib будет определено как глобальная переменная в вашей среде, вы можете создать установочный файл и добавить его в конфигурацию jest setupFilesAfterEnv

package.json
"jest": {
  // ....
  "setupFilesAfterEnv": ['<rootDir>/jest.setup.mylib.js']
}
jest.setup.mylib.js
// define global variable
global.mylib = jest.genMockFromModule('./src/mylib.js');

или определите его в своем тесте

test-point.js
import {Point} from "../point";

beforeAll(() => {
  global.mylib = jest.genMockFromModule('./src/mylib.js');
});

Но , если вы добавили mylib в качестве зависимости и у вас есть require d в ее точку

point.js
const mylib = require('mylib');

, тогда вы сможете автоматически смоделировать его в своем тесте

test-point.js
import {Point} from "../point";

jest.mock('mylib');

test("test-point", () => {
// ....
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...