Karma Angular 1.5 Error: alertify.dialog: name already exists when running a least two tests
Karma Angular 1.5 Error: alertify.dialog: name already exists when running a least two tests
版本
angular: 1.5.0
alertify-js: 1.6.1
我想在 Angular 1.5 组件上实施单元测试。
我创建了我的 karma.conf.js
,导入了我的依赖项:
//jshint strict: false
module.exports = function(config) {
config.set({
basePath: './',
files: [
'app/bower_components/jquery/dist/jquery.js',
'app/bower_components/angular/angular.js',
'app/bower_components/angular-ui-router/release/angular-ui-router.js',
'app/bower_components/angular-mocks/angular-mocks.js',
'app/bower_components/kendo-ui/src/js/kendo.ui.core.js',
'app/bower_components/kendo-ui/src/js/kendo.angular.js',
'app/bower_components/kendo-ui/src/js/cultures/kendo.culture.fr-FR.js',
'app/bower_components/alertify-js/build/alertify.js',
'app/bower_components/angular-resource/angular-resource.js',
'app/bower_components/ui-leaflet/dist/ui-leaflet.js',
'app/bower_components/angular-simple-logger/dist/angular-simple-logger.js',
'app/bower_components/lodash/lodash.js',
'app/bower_components/moment/moment.js',
'app/bower_components/moment/locale/fr.js',
'app/modules/app.js',
'app/modules/**/*.md.js',
'app/modules/**/*.js',
'test/**/*.js'
],
autoWatch: false,
frameworks: ['jasmine'],
browsers: ['Chrome'],
plugins: [
'karma-chrome-launcher',
'karma-firefox-launcher',
'karma-jasmine',
'karma-junit-reporter'
],
singleRun: true,
reporters: ['dots', 'junit'],
junitReporter: {
outputFile: 'test-results.xml'
}
});
};
这是将重现错误文件的测试用例的最小工作示例。它只需要进行两个测试:
'use strict';
describe('Component: sales', function () {
var $componentController;
var $scope;
beforeEach(module('app.sales'));
beforeEach(inject(function (_$componentController_, $rootScope, _TownshipService_, $q) {
$scope = $rootScope.$new();
$componentController = _$componentController_('sales', {$scope: $scope, TownshipService: _TownshipService_});
}));
describe('controller', function () {
it('should be defined', function () {
expect($componentController).toBeDefined();
});
it('should not crash', function () {
});
});
});
我因为 alertify 而崩溃。 We created a new dialog following the default usage of the documentation 我们称之为 auxConfirm
.
(function (app) {
'use strict';
app.run(function () {
alertify.dialog('auxConfirm', function () {
// [...]
});
});
})(angular.module('app.component'));
我们收到以下错误消息:
Chrome 55.0.2883 (Mac OS X 10.12.2) Component: sales controller FAILED
Error: alertify.dialog: name already exists
at Object.dialog ([project_folder]/ui/app/bower_components/alertify-js/build/alertify.js:2885:27)
at [project_folder]/ui/app/modules/common/component/ThreeButtonsConfirm.js:5:18
at Object.invoke ([project_folder]/ui/app/bower_components/angular/angular.js:4604:19)
at [project_folder]/ui/app/bower_components/angular/angular.js:4412:62
at forEach ([project_folder]/ui/app/bower_components/angular/angular.js:321:20)
at Object.createInjector [as injector] ([project_folder]/ui/app/bower_components/angular/angular.js:4412:3)
at Object.workFn ([project_folder]/ui/app/bower_components/angular-mocks/angular-mocks.js:2799:52)
Chrome 55.0.2883 (Mac OS X 10.12.2): Executed 2 of 2 (1 FAILED) (0.073 secs / 0.058 secs)
通过查看 alertify 源代码,当它尝试注入新的自定义对话框时,我们检查自定义对话框的名称,如果它已经存在则抛出异常:
/**
* Dialogs factory
*
* @param {string} Dialog name.
* @param {Function} A Dialog factory function.
* @param {Boolean} Indicates whether to create a singleton or transient dialog.
* @param {String} The name of the base type to inherit from.
*/
dialog: function (name, Factory, transient, base) {
// get request, create a new instance and return it.
if (typeof Factory !== 'function') {
return get_dialog(name);
}
if (this.hasOwnProperty(name)) {
throw new Error('alertify.dialog: name already exists');
}
}
我能做些什么来防止遇到这个错误?我没有找到从 alertify 中删除自定义对话框的方法,我可以将其放入 afterEach()
。有没有办法重新创建 alertify.js 来防止这种情况?
解决方案在 auxConfirm
声明文件中。在 alertify.dialog()
之前添加条件语句解决了问题。
(function (app) {
'use strict';
app.run(function () {
if (!alertify.auxConfirm) {
alertify.dialog('auxConfirm', function () {
// [...]
});
}
});
})(angular.module('app.component'));
版本
angular: 1.5.0
alertify-js: 1.6.1
我想在 Angular 1.5 组件上实施单元测试。
我创建了我的 karma.conf.js
,导入了我的依赖项:
//jshint strict: false
module.exports = function(config) {
config.set({
basePath: './',
files: [
'app/bower_components/jquery/dist/jquery.js',
'app/bower_components/angular/angular.js',
'app/bower_components/angular-ui-router/release/angular-ui-router.js',
'app/bower_components/angular-mocks/angular-mocks.js',
'app/bower_components/kendo-ui/src/js/kendo.ui.core.js',
'app/bower_components/kendo-ui/src/js/kendo.angular.js',
'app/bower_components/kendo-ui/src/js/cultures/kendo.culture.fr-FR.js',
'app/bower_components/alertify-js/build/alertify.js',
'app/bower_components/angular-resource/angular-resource.js',
'app/bower_components/ui-leaflet/dist/ui-leaflet.js',
'app/bower_components/angular-simple-logger/dist/angular-simple-logger.js',
'app/bower_components/lodash/lodash.js',
'app/bower_components/moment/moment.js',
'app/bower_components/moment/locale/fr.js',
'app/modules/app.js',
'app/modules/**/*.md.js',
'app/modules/**/*.js',
'test/**/*.js'
],
autoWatch: false,
frameworks: ['jasmine'],
browsers: ['Chrome'],
plugins: [
'karma-chrome-launcher',
'karma-firefox-launcher',
'karma-jasmine',
'karma-junit-reporter'
],
singleRun: true,
reporters: ['dots', 'junit'],
junitReporter: {
outputFile: 'test-results.xml'
}
});
};
这是将重现错误文件的测试用例的最小工作示例。它只需要进行两个测试:
'use strict';
describe('Component: sales', function () {
var $componentController;
var $scope;
beforeEach(module('app.sales'));
beforeEach(inject(function (_$componentController_, $rootScope, _TownshipService_, $q) {
$scope = $rootScope.$new();
$componentController = _$componentController_('sales', {$scope: $scope, TownshipService: _TownshipService_});
}));
describe('controller', function () {
it('should be defined', function () {
expect($componentController).toBeDefined();
});
it('should not crash', function () {
});
});
});
我因为 alertify 而崩溃。 We created a new dialog following the default usage of the documentation 我们称之为 auxConfirm
.
(function (app) {
'use strict';
app.run(function () {
alertify.dialog('auxConfirm', function () {
// [...]
});
});
})(angular.module('app.component'));
我们收到以下错误消息:
Chrome 55.0.2883 (Mac OS X 10.12.2) Component: sales controller FAILED
Error: alertify.dialog: name already exists
at Object.dialog ([project_folder]/ui/app/bower_components/alertify-js/build/alertify.js:2885:27)
at [project_folder]/ui/app/modules/common/component/ThreeButtonsConfirm.js:5:18
at Object.invoke ([project_folder]/ui/app/bower_components/angular/angular.js:4604:19)
at [project_folder]/ui/app/bower_components/angular/angular.js:4412:62
at forEach ([project_folder]/ui/app/bower_components/angular/angular.js:321:20)
at Object.createInjector [as injector] ([project_folder]/ui/app/bower_components/angular/angular.js:4412:3)
at Object.workFn ([project_folder]/ui/app/bower_components/angular-mocks/angular-mocks.js:2799:52)
Chrome 55.0.2883 (Mac OS X 10.12.2): Executed 2 of 2 (1 FAILED) (0.073 secs / 0.058 secs)
通过查看 alertify 源代码,当它尝试注入新的自定义对话框时,我们检查自定义对话框的名称,如果它已经存在则抛出异常:
/**
* Dialogs factory
*
* @param {string} Dialog name.
* @param {Function} A Dialog factory function.
* @param {Boolean} Indicates whether to create a singleton or transient dialog.
* @param {String} The name of the base type to inherit from.
*/
dialog: function (name, Factory, transient, base) {
// get request, create a new instance and return it.
if (typeof Factory !== 'function') {
return get_dialog(name);
}
if (this.hasOwnProperty(name)) {
throw new Error('alertify.dialog: name already exists');
}
}
我能做些什么来防止遇到这个错误?我没有找到从 alertify 中删除自定义对话框的方法,我可以将其放入 afterEach()
。有没有办法重新创建 alertify.js 来防止这种情况?
解决方案在 auxConfirm
声明文件中。在 alertify.dialog()
之前添加条件语句解决了问题。
(function (app) {
'use strict';
app.run(function () {
if (!alertify.auxConfirm) {
alertify.dialog('auxConfirm', function () {
// [...]
});
}
});
})(angular.module('app.component'));