Я нашел решение!
Проблема заключалась в том, что jest не был настроен из коробки при создании рабочей области nx.Поэтому я предпринял следующие шаги, чтобы все заработало:
1.Установите jest-zone-patch
npm install jest-zone-patch --save-dev
2.Редактировать файлы
Для каждой библиотеки вам нужно отредактировать файл test-setup.ts, чтобы он выглядел следующим образом:
import 'zone.js/dist/zone.js';
import 'zone.js/dist/proxy';
import 'zone.js/dist/sync-test';
import 'zone.js/dist/async-test.js';
import 'zone.js/dist/proxy.js';
import 'jest-zone-patch';
import 'jest-preset-angular';
import './jestGlobalMocks';
Также добавьте setupFilesAfterEnv: ['<rootDir>/src/test-setup.ts']
в jest.config.js
файлваша библиотека, поэтому она выглядит примерно так:
module.exports = {
name: 'my-library',
preset: '../../../jest.config.js',
coverageDirectory: '../../../coverage/libs/administration/identification',
setupFilesAfterEnv: ['<rootDir>/src/test-setup.ts']
};
и добавьте файл jestGlobalMocks.ts
в ту же папку, что и файл test-setup.ts
.Вы можете найти его здесь или просто скопировать код ниже:
Object.defineProperty(window, 'CSS', {value: null});
Object.defineProperty(document, 'doctype', {
value: '<!DOCTYPE html>'
});
Object.defineProperty(window, 'getComputedStyle', {
value: () => {
return {
display: 'none',
appearance: ['-webkit-appearance']
};
}
});
/**
* ISSUE: https://github.com/angular/material2/issues/7101
* Workaround for JSDOM missing transform property
*/
Object.defineProperty(document.body.style, 'transform', {
value: () => {
return {
enumerable: true,
configurable: true,
};
},
});
3.Изменить файлы спецификаций
Измените созданный файл спецификаций на что-то вроде этого:
describe('MyComponent', () => {
let component: MyComponent;
let fixture: ComponentFixture<MyComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [MyComponent]
})
.compileComponents()
.then(() => {
fixture = TestBed.createComponent(MyComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
}));
it('should create', () => {
expect(component).toBeTruthy();
});
});
Таким образом, компонент и приспособление создаются после завершения обещания compileComponents
, что позволяет избежатьусловия гонки и потенциал неопределено ошибка в 'should create'
модульном тесте.
4.Запустите тест библиотеки
Finnaly, вы можете запустить свой тест и, надеюсь, он пройдет.
ng test my-library
Надеюсь, что это кому-нибудь поможет.