Angular 4 Unit Tests (TestBed) extremely slow Angular 4 Unit Tests (TestBed) extremely slow angular angular

Angular 4 Unit Tests (TestBed) extremely slow


It turned out the problem is with Angular, as addressed on Github

Below a workaround from the Github discussion that dropped the time for running the tests from more than 40 seconds to just 1 second (!) in our project.

const oldResetTestingModule = TestBed.resetTestingModule;beforeAll((done) => (async () => {  TestBed.resetTestingModule();  TestBed.configureTestingModule({    // ...  });  function HttpLoaderFactory(http: Http) {    return new TranslateHttpLoader(http, "/api/translations/", "");  }  await TestBed.compileComponents();  // prevent Angular from resetting testing module  TestBed.resetTestingModule = () => TestBed;})()  .then(done)  .catch(done.fail));


describe('Test name', () => {    configureTestSuite();    beforeAll(done => (async () => {       TestBed.configureTestingModule({            imports: [HttpClientTestingModule, NgReduxTestingModule],            providers: []       });       await TestBed.compileComponents();    })().then(done).catch(done.fail));    it(‘your test', (done: DoneFn) => {    });});

Create new file:

    import { getTestBed, TestBed, ComponentFixture } from '@angular/core/testing';    import { } from 'jasmine';    export const configureTestSuite = () => {       const testBedApi: any = getTestBed();       const originReset = TestBed.resetTestingModule;       beforeAll(() => {         TestBed.resetTestingModule();         TestBed.resetTestingModule = () => TestBed;       });       afterEach(() => {         testBedApi._activeFixtures.forEach((fixture: ComponentFixture<any>) => fixture.destroy());         testBedApi._instantiated = false;       });       afterAll(() => {          TestBed.resetTestingModule = originReset;          TestBed.resetTestingModule();       });    };


Francesco's answer above is great, but it requires this code at the end. Otherwise other test suites will fail.

    afterAll(() => {        TestBed.resetTestingModule = oldResetTestingModule;        TestBed.resetTestingModule();    });