Угловой 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!');
}));
});


Я не понимаю, почему бывают какие-то сбои.
647   1  

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

    Ничего не найдено.