Угловой 2 Испытание командной строки блока Жасмин не удается, при использовании beforeAll, а не после каждого
Я создал новый проект с помощью NG-CLI (beta.15) и модифицировал app.component.spec, чтобы изменить beforeEach на beforeAll, и это привело к сбою тестов со следующей ошибкой:
Failed: не удается создать компонент AppComponent, так как он не был импортирован в модуль тестирования!
Я не понимаю, что означает эта ошибка и, конечно, почему я получил бы ее в первую очередь.
Вот модифицированная спецификация:
import { TestBed, async } from '@angular/core/testing';
import { AppComponent } from './app.component';
describe('App: Ng2CliTest2', () => {
beforeAll(() => {
TestBed.configureTestingModule({
declarations: [
AppComponent
],
});
});
it('should create the app', async(() => {
let fixture = TestBed.createComponent(AppComponent);
let app = fixture.debugElement.componentInstance;
expect(app).toBeTruthy();
}));
it(`should have as title 'app works!'`, async(() => {
let fixture = TestBed.createComponent(AppComponent);
let app = fixture.debugElement.componentInstance;
expect(app.title).toEqual('app works!');
}));
it('should render title in a h1 tag', async(() => {
let fixture = TestBed.createComponent(AppComponent);
fixture.detectChanges();
let compiled = fixture.debugElement.nativeElement;
expect(compiled.querySelector('h1').textContent).toContain('app works!');
}));
});
Затем я изменил спецификацию на это и первые два теста проходят, а третий терпит неудачу со следующим сообщением:
Ошибка: попытка использовать разрушенный вид: detectChanges
import { TestBed, async } from '@angular/core/testing';
import { AppComponent } from './app.component';
let fixture;
let app;
describe('App: Ng2CliTest2', () => {
beforeAll(() => {
TestBed.configureTestingModule({
declarations: [
AppComponent
],
});
fixture = TestBed.createComponent(AppComponent);
app = fixture.debugElement.componentInstance;
});
it('should create the app', async(() => {
expect(app).toBeTruthy();
}));
it(`should have as title 'app works!'`, async(() => {
expect(app.title).toEqual('app works!');
}));
it('should render title in a h1 tag', async(() => {
fixture.detectChanges();
let compiled = fixture.debugElement.nativeElement;
expect(compiled.querySelector('h1').textContent).toContain('app works!');
}));
});
Я не понимаю, почему бывают какие-то сбои.
1 ответ:
Не зная этого, Angular на самом деле сбрасывает модуль тестирования в своем собственном тайнике
beforeEach(видишьtesting.ts)var _global = <any>(typeof window === 'undefined' ? global : window); // Reset the test providers and the fake async zone before each test. if (_global.beforeEach) { _global.beforeEach(() => { TestBed.resetTestingModule(); resetFakeAsyncZone(); }); }Я даже не пробовал этого, но вы хотите знать, как это работает, чтобы, возможно, попробовать и (безопасно) отключить эту функцию, вот что я понял:
Где-то в вашей конфигурации вы импортировали
@angular/core/bundles/core-testing.umd.jsЭто много раз в файле
karma-test-shim.js. Этот файл содержит почти все утилиты тестирования, которые мы используем в Angular test. Это в значительной степени компиляция всего, что экспортируется из модуля тестирования . Это включает в себя приведенный выше файл тестирования, который добавляет глобальный вызовbeforeEach.И только если из приведенной выше информации не очевидно, что ваш
beforeAllхорош только для первого теста, то Angular сбрасывает испытательный стенд. Поэтому в следующем тесте вы пытаетесь создать компонент из пустой конфигурации тестового стенда.
Comments