Минимальный воспроизводимый пример
SomeClass.js
import Rx from "rxjs/Rx.js";
class SomeClass {
constructor() {
this.subject = new Rx.Subject();
}
}
SomeClass.test.js
import SomeClass from "./SomeClass.js";
let someClass = new SomeClass();
После запуска npm test
я получаю сообщение об ошибке TypeError: Cannot read property 'Subject' of undefined
. Rxjs был установлен в моем проекте.
Есть идеи?
Вариант 1. Используйте Manual Mocks, мокайте модуль rxjs/Rx.js
явно.
Например.
SomeClass.js
:
import Rx from 'rxjs/Rx.js';
export default class SomeClass {
constructor() {
this.subject = new Rx.Subject();
}
}
SomeClass.test.js
:
import SomeClass from './SomeClass';
import Rx from 'rxjs/Rx.js';
jest.mock('rxjs/Rx.js', () => {
return { Subject: jest.fn() };
});
describe('65261235', () => {
it('should pass', () => {
let someClass = new SomeClass();
expect(Rx.Subject).toBeCalledTimes(1);
});
});
результат модульного теста:
PASS examples/65261235/SomeClass.test.js
65261235
✓ should pass (2 ms)
--------------|---------|----------|---------|---------|-------------------
File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s
--------------|---------|----------|---------|---------|-------------------
All files | 100 | 100 | 100 | 100 |
SomeClass.js | 100 | 100 | 100 | 100 |
--------------|---------|----------|---------|---------|-------------------
Test Suites: 1 passed, 1 total
Tests: 1 passed, 1 total
Snapshots: 0 total
Time: 5.877 s
Вариант 2. включить automock для jestjs.
Эта опция сообщает Jest, что все импортированные модули в ваших тестах должны автоматически имитироваться. Все модули, используемые в ваших тестах, будут иметь замену реализации, сохраняя поверхность API.
Спасибо за быстрый ответ ... так что, действительно ли нет способа использовать настоящую тему rxjs? Потому что, когда я пытаюсь сделать
return { Subject: Rx.Subject() };
в лямбда-функции внутри функции jest.mock(), выдается ошибка, говорящая: «Фабрика модулей jest.mock()» не может ссылаться на какие-либо переменные вне области видимости. ."