Карма-тест: случайный тест не проходит при использовании асинхронного в других тестах - PullRequest
0 голосов
/ 08 ноября 2018

У меня проблема с Карма-Тестами. Когда я запускаю свои тесты, иногда у меня появляется эта ошибка:

HeadlessChrome 70.0.3538 (Windows 10.0.0) ERROR
  {
    "message": "An error was thrown in afterAll\n[object ErrorEvent] thrown",
    "str": "An error was thrown in afterAll\n[object ErrorEvent] thrown"
  }

Если я ничего не меняю и снова запускаю те же тесты, тест может не пройти.

Я читал, что это может быть ошибка в асинхронных тестах (https://github.com/karma-runner/karma/issues/2811#issuecomment-407600850),, поэтому я удалил все свои асинхронные и fakeasync тесты. Однако это все равно не решает проблему. Без асинхронных и fakeasync тестов , У меня есть эта ошибка:

HeadlessChrome 70.0.3538 (Windows 10.0.0) MyComponent should create FAILED
        [object ErrorEvent] thrown
HeadlessChrome 70.0.3538 (Windows 10.0.0): Executed 50 of 55 (1 FAILED) (0 secs / 0 secs)

Но в тесте этого компонента я не могу найти ошибку:

describe('MyComponent', () => {
    let component: MyComponent;
    let fixture: ComponentFixture<MyComponent>;
    const zipService = jasmine.createSpyObj('ZipService', {
        search: of([])
    });

    beforeEach(() => {
        TestBed.configureTestingModule({
            declarations: [MyComponent, OnOffSwitchComponent, TranslatePipeMock],
            imports: [
                NgbModule.forRoot(),
                FormsModule,
                ReactiveFormsModule
            ],
            providers: [
                {provide: TranslateService, useValue: translateServiceMock()},
                {provide: UtilService, useValue: utilMock()},
                {provide: ZipService, useValue: zipService}
            ]
        }).compileComponents();
        fixture = TestBed.createComponent(MyComponent);
        component = fixture.componentInstance;
        fixture.detectChanges();
    });

    it('should create', () => {
        expect(component).toBeTruthy();
    });
});

Кто-нибудь знает, о чем это может быть?

1 Ответ

0 голосов
/ 27 февраля 2019

ваш перед каждым блоком неверен, потому что вы пытаетесь создать компонент MyComponent до завершения части компиляции, если вы посмотрите на https://angular.io/api/core/testing/TestBed#compileComponents, вы увидите, что TestBed.compileComponents возвращает обещание.поэтому шаблон вашего теста должен измениться зря.Прежде всего, вы должны сделать так, чтобы beforeEach знал, что он содержит некоторые асинхронные действия, есть несколько способов сделать это, включая собственный async / await, angular предлагает утилиту async() из коробки.который превратит ваш тест в beforeEach(async( () => {...})), тогда второй бит в том, что создание вашего макета должно произойти, когда компоненты скомпилированы.так что все вместе ваш код будет выглядеть как

beforeEach(async(() => {
TestBed.configureTestingModule({
    declarations: [MyComponent, OnOffSwitchComponent, TranslatePipeMock],
    imports: [
        NgbModule.forRoot(),
        FormsModule,
        ReactiveFormsModule
    ],
    providers: [
        {provide: TranslateService, useValue: translateServiceMock()},
        {provide: UtilService, useValue: utilMock()},
        {provide: ZipService, useValue: zipService}
    ]
}).compileComponents().then(() => {
   fixture = TestBed.createComponent(MyComponent);
   component = fixture.componentInstance;
   fixture.detectChanges();
  });    
}));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...