UNPKG

sinsunsan-ng-bullet-workspace

Version:

Angular library which drastically improves execution time of your component's unit tests. This fork fix a problem in the original ng-bullet #48. Error messages in the test execution

74 lines 10.1 kB
import { TestBed, getTestBed } from '@angular/core/testing'; /** * Reconfigures current test suit to prevent angular components re-compilation after every test run. * Forces angular test bed to re-create zone and all injectable services by directly * setting _instantiated variable to false after every test run. * Cleanups all the changes and reverts test bed configuration after suite has finished. * * @param configureAction an optional delegate which can be used to configure test bed for the current test suite * directly in the configureTestSuite call (you don't need extra BeforeAll in this case) */ export const configureTestSuite = (configureAction) => { const testBedApi = getTestBed(); const originReset = TestBed.resetTestingModule; beforeAll(() => { TestBed.resetTestingModule(); TestBed.resetTestingModule = () => TestBed; }); // https://github.com/topnotch48/ng-bullet-workspace/issues/38 if (configureAction) { beforeAll((done) => { (async function () { configureAction(); await TestBed.compileComponents(); }().then(done).catch(done.fail)); }); } afterEach(() => { testBedApi._activeFixtures.forEach((fixture) => fixture.destroy()); // reset ViewEngine TestBed testBedApi._instantiated = false; // reset Ivy TestBed testBedApi._testModuleRef = null; }); afterAll(() => { TestBed.resetTestingModule = originReset; TestBed.resetTestingModule(); }); }; /** * A wrapper class around ComponentFixture, which provides useful accessros: * component - to access component instance of current the fixture * element - to access underlying native element of the current component * detectChanges - to run change detections using current fixture * resolve - to resolve a type using current fixture's injector */ export class TestCtx { constructor(fixture) { this.fixture = fixture; } get component() { return this.fixture.componentInstance; } get element() { return this.fixture.debugElement.nativeElement; } detectChanges() { this.fixture.detectChanges(); } resolve(component) { return this.fixture.debugElement.injector.get(component); } } /** * Creates TestCtx instance for the Angular Component which is not initialized yet (no ngOnInit called) * Use case: you can override Component's providers before hooks are called. * * @param component - type of component to create instance of * **/ export const createTestContext = (component) => { const fixture = TestBed.createComponent(component); const testCtx = new TestCtx(fixture); return testCtx; }; /**Same as @function createTestContext, but waits till fixture becomes stable */ export const createStableTestContext = async (component) => { const testCtx = createTestContext(component); testCtx.detectChanges(); await testCtx.fixture.whenStable(); testCtx.detectChanges(); return testCtx; }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdGluZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25nLWJ1bGxldC9zcmMvdGVzdGluZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQW9CLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUk5RTs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLENBQUMsZUFBNEIsRUFBRSxFQUFFO0lBQy9ELE1BQU0sVUFBVSxHQUFRLFVBQVUsRUFBRSxDQUFDO0lBQ3JDLE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQztJQUUvQyxTQUFTLENBQUMsR0FBRyxFQUFFO1FBQ1gsT0FBTyxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDN0IsT0FBTyxDQUFDLGtCQUFrQixHQUFHLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQztJQUMvQyxDQUFDLENBQUMsQ0FBQztJQUVILDhEQUE4RDtJQUM5RCxJQUFJLGVBQWUsRUFBRTtRQUNqQixTQUFTLENBQUMsQ0FBQyxJQUFZLEVBQUUsRUFBRTtZQUN6QixDQUFDLEtBQUs7Z0JBQ0osZUFBZSxFQUFFLENBQUM7Z0JBQ2xCLE1BQU0sT0FBTyxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDcEMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUNuQyxDQUFDLENBQUMsQ0FBQztLQUNKO0lBRUgsU0FBUyxDQUFDLEdBQUcsRUFBRTtRQUNYLFVBQVUsQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBOEIsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDMUYsMkJBQTJCO1FBQzNCLFVBQVUsQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO1FBQ2pDLG9CQUFvQjtRQUNwQixVQUFVLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztJQUNyQyxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyxHQUFHLEVBQUU7UUFDVixPQUFPLENBQUMsa0JBQWtCLEdBQUcsV0FBVyxDQUFDO1FBQ3pDLE9BQU8sQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO0lBQ2pDLENBQUMsQ0FBQyxDQUFDO0FBQ1AsQ0FBQyxDQUFDO0FBRUY7Ozs7OztHQU1HO0FBQ0gsTUFBTSxPQUFPLE9BQU87SUFDaEIsWUFBbUIsT0FBNEI7UUFBNUIsWUFBTyxHQUFQLE9BQU8sQ0FBcUI7SUFBSSxDQUFDO0lBRXBELElBQVcsU0FBUyxLQUFLLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUM7SUFFakUsSUFBVyxPQUFPLEtBQWtCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQztJQUU5RSxhQUFhLEtBQUssSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFFakQsT0FBTyxDQUFDLFNBQW9CLElBQUksT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztDQUNyRztBQUVEOzs7OztNQUtNO0FBQ04sTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUcsQ0FBSSxTQUFrQixFQUFFLEVBQUU7SUFDdkQsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLGVBQWUsQ0FBSSxTQUFTLENBQUMsQ0FBQztJQUN0RCxNQUFNLE9BQU8sR0FBRyxJQUFJLE9BQU8sQ0FBSSxPQUFPLENBQUMsQ0FBQztJQUN4QyxPQUFPLE9BQU8sQ0FBQztBQUNuQixDQUFDLENBQUM7QUFFRixnRkFBZ0Y7QUFDaEYsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUcsS0FBSyxFQUFLLFNBQWtCLEVBQUUsRUFBRTtJQUNuRSxNQUFNLE9BQU8sR0FBRyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUM3QyxPQUFPLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDeEIsTUFBTSxPQUFPLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ25DLE9BQU8sQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUN4QixPQUFPLE9BQU8sQ0FBQztBQUNuQixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnRGaXh0dXJlLCBUZXN0QmVkLCBnZXRUZXN0QmVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS90ZXN0aW5nJztcblxuaW1wb3J0IHsgVHlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG4vKipcbiAqIFJlY29uZmlndXJlcyBjdXJyZW50IHRlc3Qgc3VpdCB0byBwcmV2ZW50IGFuZ3VsYXIgY29tcG9uZW50cyByZS1jb21waWxhdGlvbiBhZnRlciBldmVyeSB0ZXN0IHJ1bi5cbiAqIEZvcmNlcyBhbmd1bGFyIHRlc3QgYmVkIHRvIHJlLWNyZWF0ZSB6b25lIGFuZCBhbGwgaW5qZWN0YWJsZSBzZXJ2aWNlcyBieSBkaXJlY3RseVxuICogc2V0dGluZyBfaW5zdGFudGlhdGVkIHZhcmlhYmxlIHRvIGZhbHNlIGFmdGVyIGV2ZXJ5IHRlc3QgcnVuLlxuICogQ2xlYW51cHMgYWxsIHRoZSBjaGFuZ2VzIGFuZCByZXZlcnRzIHRlc3QgYmVkIGNvbmZpZ3VyYXRpb24gYWZ0ZXIgc3VpdGUgaGFzIGZpbmlzaGVkLlxuICpcbiAqIEBwYXJhbSBjb25maWd1cmVBY3Rpb24gYW4gb3B0aW9uYWwgZGVsZWdhdGUgd2hpY2ggY2FuIGJlIHVzZWQgdG8gY29uZmlndXJlIHRlc3QgYmVkIGZvciB0aGUgY3VycmVudCB0ZXN0IHN1aXRlXG4gKiBkaXJlY3RseSBpbiB0aGUgY29uZmlndXJlVGVzdFN1aXRlIGNhbGwgKHlvdSBkb24ndCBuZWVkIGV4dHJhIEJlZm9yZUFsbCBpbiB0aGlzIGNhc2UpXG4gKi9cbmV4cG9ydCBjb25zdCBjb25maWd1cmVUZXN0U3VpdGUgPSAoY29uZmlndXJlQWN0aW9uPzogKCkgPT4gdm9pZCkgPT4ge1xuICAgIGNvbnN0IHRlc3RCZWRBcGk6IGFueSA9IGdldFRlc3RCZWQoKTtcbiAgICBjb25zdCBvcmlnaW5SZXNldCA9IFRlc3RCZWQucmVzZXRUZXN0aW5nTW9kdWxlO1xuXG4gICAgYmVmb3JlQWxsKCgpID0+IHtcbiAgICAgICAgVGVzdEJlZC5yZXNldFRlc3RpbmdNb2R1bGUoKTtcbiAgICAgICAgVGVzdEJlZC5yZXNldFRlc3RpbmdNb2R1bGUgPSAoKSA9PiBUZXN0QmVkO1xuICAgIH0pO1xuXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3RvcG5vdGNoNDgvbmctYnVsbGV0LXdvcmtzcGFjZS9pc3N1ZXMvMzhcbiAgICBpZiAoY29uZmlndXJlQWN0aW9uKSB7XG4gICAgICAgIGJlZm9yZUFsbCgoZG9uZTogRG9uZUZuKSA9PiB7XG4gICAgICAgICAgKGFzeW5jIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgY29uZmlndXJlQWN0aW9uKCk7XG4gICAgICAgICAgICBhd2FpdCBUZXN0QmVkLmNvbXBpbGVDb21wb25lbnRzKCk7XG4gICAgICAgICAgfSgpLnRoZW4oZG9uZSkuY2F0Y2goZG9uZS5mYWlsKSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgYWZ0ZXJFYWNoKCgpID0+IHtcbiAgICAgICAgdGVzdEJlZEFwaS5fYWN0aXZlRml4dHVyZXMuZm9yRWFjaCgoZml4dHVyZTogQ29tcG9uZW50Rml4dHVyZTxhbnk+KSA9PiBmaXh0dXJlLmRlc3Ryb3koKSk7XG4gICAgICAgIC8vIHJlc2V0IFZpZXdFbmdpbmUgVGVzdEJlZFxuICAgICAgICB0ZXN0QmVkQXBpLl9pbnN0YW50aWF0ZWQgPSBmYWxzZTtcbiAgICAgICAgLy8gcmVzZXQgSXZ5IFRlc3RCZWRcbiAgICAgICAgdGVzdEJlZEFwaS5fdGVzdE1vZHVsZVJlZiA9IG51bGw7XG4gICAgfSk7XG5cbiAgICBhZnRlckFsbCgoKSA9PiB7XG4gICAgICAgIFRlc3RCZWQucmVzZXRUZXN0aW5nTW9kdWxlID0gb3JpZ2luUmVzZXQ7XG4gICAgICAgIFRlc3RCZWQucmVzZXRUZXN0aW5nTW9kdWxlKCk7XG4gICAgfSk7XG59O1xuXG4vKipcbiAqIEEgd3JhcHBlciBjbGFzcyBhcm91bmQgQ29tcG9uZW50Rml4dHVyZSwgd2hpY2ggcHJvdmlkZXMgdXNlZnVsIGFjY2Vzc3JvczpcbiAqIGNvbXBvbmVudCAtIHRvIGFjY2VzcyBjb21wb25lbnQgaW5zdGFuY2Ugb2YgY3VycmVudCB0aGUgZml4dHVyZVxuICogZWxlbWVudCAtIHRvIGFjY2VzcyB1bmRlcmx5aW5nIG5hdGl2ZSBlbGVtZW50IG9mIHRoZSBjdXJyZW50IGNvbXBvbmVudFxuICogZGV0ZWN0Q2hhbmdlcyAtIHRvIHJ1biBjaGFuZ2UgZGV0ZWN0aW9ucyB1c2luZyBjdXJyZW50IGZpeHR1cmVcbiAqIHJlc29sdmUgLSB0byByZXNvbHZlIGEgdHlwZSB1c2luZyBjdXJyZW50IGZpeHR1cmUncyBpbmplY3RvclxuICovXG5leHBvcnQgY2xhc3MgVGVzdEN0eDxUPiB7XG4gICAgY29uc3RydWN0b3IocHVibGljIGZpeHR1cmU6IENvbXBvbmVudEZpeHR1cmU8VD4pIHsgfVxuXG4gICAgcHVibGljIGdldCBjb21wb25lbnQoKSB7IHJldHVybiB0aGlzLmZpeHR1cmUuY29tcG9uZW50SW5zdGFuY2U7IH1cblxuICAgIHB1YmxpYyBnZXQgZWxlbWVudCgpOiBIVE1MRWxlbWVudCB7IHJldHVybiB0aGlzLmZpeHR1cmUuZGVidWdFbGVtZW50Lm5hdGl2ZUVsZW1lbnQ7IH1cblxuICAgIHB1YmxpYyBkZXRlY3RDaGFuZ2VzKCkgeyB0aGlzLmZpeHR1cmUuZGV0ZWN0Q2hhbmdlcygpOyB9XG5cbiAgICBwdWJsaWMgcmVzb2x2ZShjb21wb25lbnQ6IFR5cGU8YW55PikgeyByZXR1cm4gdGhpcy5maXh0dXJlLmRlYnVnRWxlbWVudC5pbmplY3Rvci5nZXQoY29tcG9uZW50KTsgfVxufVxuXG4vKipcbiAqIENyZWF0ZXMgVGVzdEN0eCBpbnN0YW5jZSBmb3IgdGhlIEFuZ3VsYXIgQ29tcG9uZW50IHdoaWNoIGlzIG5vdCBpbml0aWFsaXplZCB5ZXQgKG5vIG5nT25Jbml0IGNhbGxlZClcbiAqIFVzZSBjYXNlOiB5b3UgY2FuIG92ZXJyaWRlIENvbXBvbmVudCdzIHByb3ZpZGVycyBiZWZvcmUgaG9va3MgYXJlIGNhbGxlZC5cbiAqXG4gKiBAcGFyYW0gY29tcG9uZW50IC0gdHlwZSBvZiBjb21wb25lbnQgdG8gY3JlYXRlIGluc3RhbmNlIG9mXG4gKiAqKi9cbmV4cG9ydCBjb25zdCBjcmVhdGVUZXN0Q29udGV4dCA9IDxUPihjb21wb25lbnQ6IFR5cGU8VD4pID0+IHtcbiAgICBjb25zdCBmaXh0dXJlID0gVGVzdEJlZC5jcmVhdGVDb21wb25lbnQ8VD4oY29tcG9uZW50KTtcbiAgICBjb25zdCB0ZXN0Q3R4ID0gbmV3IFRlc3RDdHg8VD4oZml4dHVyZSk7XG4gICAgcmV0dXJuIHRlc3RDdHg7XG59O1xuXG4vKipTYW1lIGFzIEBmdW5jdGlvbiBjcmVhdGVUZXN0Q29udGV4dCwgYnV0IHdhaXRzIHRpbGwgZml4dHVyZSBiZWNvbWVzIHN0YWJsZSAqL1xuZXhwb3J0IGNvbnN0IGNyZWF0ZVN0YWJsZVRlc3RDb250ZXh0ID0gYXN5bmMgPFQ+KGNvbXBvbmVudDogVHlwZTxUPikgPT4ge1xuICAgIGNvbnN0IHRlc3RDdHggPSBjcmVhdGVUZXN0Q29udGV4dChjb21wb25lbnQpO1xuICAgIHRlc3RDdHguZGV0ZWN0Q2hhbmdlcygpO1xuICAgIGF3YWl0IHRlc3RDdHguZml4dHVyZS53aGVuU3RhYmxlKCk7XG4gICAgdGVzdEN0eC5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgcmV0dXJuIHRlc3RDdHg7XG59O1xuIl19