mirror of
https://github.com/angular/angular.git
synced 2026-09-14 13:54:52 +08:00
140 lines
5.9 KiB
JavaScript
140 lines
5.9 KiB
JavaScript
/*global jasmine, __karma__, window*/
|
|
Error.stackTraceLimit = Infinity;
|
|
|
|
// The default time that jasmine waits for an asynchronous test to finish is five seconds.
|
|
// If this timeout is too short the CI may fail randomly because our asynchronous tests can
|
|
// take longer in some situations (e.g Saucelabs and Browserstack tunnels)
|
|
jasmine.DEFAULT_TIMEOUT_INTERVAL = 10000;
|
|
|
|
__karma__.loaded = function () {};
|
|
|
|
var baseDir = '/base';
|
|
var specFiles = Object.keys(window.__karma__.files).filter(isMaterialSpecFile);
|
|
|
|
// Configure the base path and map the different node packages.
|
|
System.config({
|
|
baseURL: baseDir,
|
|
paths: {
|
|
'node:*': 'node_modules/*'
|
|
},
|
|
map: {
|
|
'rxjs': 'node:rxjs',
|
|
'main': 'main.js',
|
|
|
|
// Angular specific mappings.
|
|
'@angular/core': 'node:@angular/core/bundles/core.umd.js',
|
|
'@angular/core/testing': 'node:@angular/core/bundles/core-testing.umd.js',
|
|
'@angular/common': 'node:@angular/common/bundles/common.umd.js',
|
|
'@angular/common/testing': 'node:@angular/common/bundles/common-testing.umd.js',
|
|
'@angular/compiler': 'node:@angular/compiler/bundles/compiler.umd.js',
|
|
'@angular/compiler/testing': 'node:@angular/compiler/bundles/compiler-testing.umd.js',
|
|
'@angular/http': 'node:@angular/http/bundles/http.umd.js',
|
|
'@angular/http/testing': 'node:@angular/http/bundles/http-testing.umd.js',
|
|
'@angular/forms': 'node:@angular/forms/bundles/forms.umd.js',
|
|
'@angular/forms/testing': 'node:@angular/forms/bundles/forms-testing.umd.js',
|
|
'@angular/animations': 'node:@angular/animations/bundles/animations.umd.js',
|
|
'@angular/animations/browser': 'node:@angular/animations/bundles/animations-browser.umd.js',
|
|
'@angular/platform-browser/animations':
|
|
'node:@angular/platform-browser/bundles/platform-browser-animations.umd',
|
|
'@angular/platform-browser':
|
|
'node:@angular/platform-browser/bundles/platform-browser.umd.js',
|
|
'@angular/platform-browser/testing':
|
|
'node:@angular/platform-browser/bundles/platform-browser-testing.umd.js',
|
|
'@angular/platform-browser-dynamic':
|
|
'node:@angular/platform-browser-dynamic/bundles/platform-browser-dynamic.umd.js',
|
|
'@angular/platform-browser-dynamic/testing':
|
|
'node:@angular/platform-browser-dynamic/bundles/platform-browser-dynamic-testing.umd.js',
|
|
|
|
// Path mappings for local packages that can be imported inside of tests.
|
|
// TODO(devversion): replace once the index.ts file for the Material package has been added.
|
|
'@angular/material': 'dist/packages/material/public_api.js',
|
|
'@angular/cdk': 'dist/packages/cdk/index.js',
|
|
},
|
|
packages: {
|
|
// Thirdparty barrels.
|
|
'rxjs': {main: 'index'},
|
|
|
|
// Set the default extension for the root package, because otherwise the demo-app can't
|
|
// be built within the production mode. Due to missing file extensions.
|
|
'.': {
|
|
defaultExtension: 'js'
|
|
}
|
|
}
|
|
});
|
|
|
|
// Configure the Angular test bed and run all specs once configured.
|
|
configureTestBed()
|
|
.then(runMaterialSpecs)
|
|
.then(__karma__.start, __karma__.error);
|
|
|
|
|
|
/** Runs the Angular Material specs in Karma. */
|
|
function runMaterialSpecs() {
|
|
// By importing all spec files, Karma will run the tests directly.
|
|
return Promise.all(specFiles.map(function(fileName) {
|
|
return System.import(fileName);
|
|
}));
|
|
}
|
|
|
|
/** Whether the specified file is part of Angular Material. */
|
|
function isMaterialSpecFile(path) {
|
|
return path.slice(-8) === '.spec.js' && path.indexOf('node_modules') === -1;
|
|
}
|
|
|
|
/** Configures Angular's TestBed. */
|
|
function configureTestBed() {
|
|
return Promise.all([
|
|
System.import('@angular/core/testing'),
|
|
System.import('@angular/platform-browser-dynamic/testing')
|
|
]).then(function (providers) {
|
|
var testing = providers[0];
|
|
var testingBrowser = providers[1];
|
|
|
|
var testBed = testing.TestBed.initTestEnvironment(
|
|
testingBrowser.BrowserDynamicTestingModule,
|
|
testingBrowser.platformBrowserDynamicTesting()
|
|
);
|
|
|
|
patchTestBedToDestroyFixturesAfterEveryTest(testBed);
|
|
});
|
|
}
|
|
|
|
/**
|
|
* 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.
|
|
var _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(function (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(function() {
|
|
testBed.resetTestingModule();
|
|
});
|
|
}
|