mirror of
https://github.com/angular/angular.git
synced 2026-09-14 13:54:52 +08:00
21a83bae8d
This adds bazel test rules for everything under cdk/ and sets CircleCI Overlay tests don't work because there's not yet a way to pass through flags to the browser. These issues will be addressed in a follow-up PR.
57 lines
2.5 KiB
TypeScript
57 lines
2.5 KiB
TypeScript
import {TestBed} from '@angular/core/testing';
|
|
import {
|
|
BrowserDynamicTestingModule,
|
|
platformBrowserDynamicTesting,
|
|
} from '@angular/platform-browser-dynamic/testing';
|
|
|
|
|
|
/* Common setup / initialization for all unit tests in Angular Material and CDK. */
|
|
|
|
|
|
const testBed = TestBed.initTestEnvironment(
|
|
[BrowserDynamicTestingModule], platformBrowserDynamicTesting());
|
|
patchTestBedToDestroyFixturesAfterEveryTest(testBed);
|
|
|
|
(window as any).module = {};
|
|
(window as any).isNode = false;
|
|
(window as any).isBrowser = true;
|
|
(window as any).global = window;
|
|
|
|
|
|
/**
|
|
* Monkey-patches TestBed.resetTestingModule such that any errors that occur during component
|
|
* destruction are thrown instead of silently logged. Also runs TestBed.resetTestingModule after
|
|
* each unit test.
|
|
*
|
|
* Without this patch, the combination of two behaviors is problematic for Angular Material:
|
|
* - TestBed.resetTestingModule catches errors thrown on fixture destruction and logs them without
|
|
* the errors ever being thrown. This means that any component errors that occur in ngOnDestroy
|
|
* can encounter errors silently and still pass unit tests.
|
|
* - TestBed.resetTestingModule is only called *before* a test is run, meaning that even *if* the
|
|
* aforementioned errors were thrown, they would be reported for the wrong test (the test that's
|
|
* about to start, not the test that just finished).
|
|
*/
|
|
function patchTestBedToDestroyFixturesAfterEveryTest(testBed) {
|
|
// Original resetTestingModule function of the TestBed.
|
|
const _resetTestingModule = testBed.resetTestingModule;
|
|
|
|
// Monkey-patch the resetTestingModule to destroy fixtures outside of a try/catch block.
|
|
// With https://github.com/angular/angular/commit/2c5a67134198a090a24f6671dcdb7b102fea6eba
|
|
// errors when destroying components are no longer causing Jasmine to fail.
|
|
testBed.resetTestingModule = function() {
|
|
try {
|
|
this._activeFixtures.forEach(fixture => fixture.destroy());
|
|
} finally {
|
|
this._activeFixtures = [];
|
|
// Regardless of errors or not, run the original reset testing module function.
|
|
_resetTestingModule.call(this);
|
|
}
|
|
};
|
|
|
|
// Angular's testing package resets the testing module before each test. This doesn't work well
|
|
// for us because it doesn't allow developers to see what test actually failed.
|
|
// Fixing this by resetting the testing module after each test.
|
|
// https://github.com/angular/angular/blob/master/packages/core/testing/src/before_each.ts#L25
|
|
afterEach(() => testBed.resetTestingModule());
|
|
}
|