AngularJS:Karma 无法使用 app.config 中定义的提供程序并需要 DOM
AngularJS: Karma fails with providers that are defined in the app.config and require the DOM
我有一个正在运行的 AngularJS 项目,我是第一次配置 Karma。
这个测试有效:
describe('myFactory', function () {
// Load your module.
beforeEach(module('MyApp'));
it('can get an instance of my factory', inject(function(sampleSvc) {
expect(sampleSvc).toBeDefined();
}));
});
此测试无效:
describe('myFactory', function () {
// Load your module.
beforeEach(module('MyApp'));
// Setup the mock service in an anonymous module.
beforeEach(module(function ($provide) {
$provide.service('$window', function(){
this.alert= jasmine.createSpy('alert');
});
}));
it('can get an instance of my factory', inject(function(sampleSvc) {
expect(sampleSvc).toBeDefined();
}));
});
第 3 方角度分析失败:
当我从 app.config 中删除 angulartics 时,它在热键上失败了:
这对我来说是新的。
- 我应该使用不同的 app.js 进行测试吗?
- Karma 在第 3 方 DOM 提供商上失败是否有原因?有DOM准时准备好的吗?
我的 app.js 配置部分:
app.config(['$routeProvider', '$translateProvider', 'i18n', '$analyticsProvider',
function ($routeProvider, $translateProvider, i18n, $analyticsProvider) {
$analyticsProvider.developerMode(true);
$analyticsProvider.firstPageview(true);
/* Records pages that don't use $state or $route */
$analyticsProvider.withAutoBase(true);
$routeProvider.
when('/welcome', {
templateUrl: 'partials/welcome/welcome.html',
controller: 'WelcomeCtrl'
}).
when('/main', {
templateUrl: 'partials/main/main.html',
controller: 'MainCtrl',
hotkeys: [
['tab', 'Add a new task', 'addNewEventByTab()']
]
}).
when('/migration', {
templateUrl: 'partials/migration/migration.html',
controller: 'MigrationCtrl'
}).
when('/loadingPage', {
templateUrl: 'partials/loadingPage/loadingPage.html',
controller: 'LoadingPageCtrl'
}).
when('/beta', {
templateUrl: 'partials/closedBeta/closedBeta.html',
controller: 'ClosedBetaCtrl'
}).
otherwise({
redirectTo: '/loadingPage'
});
}]);
Should I use a different app.js for testing?
1.全局模拟你的模块
(用于您所有的测试,但是,您将无法测试此模块)
- 在create中创建文件夹mocks/ moduleName.js
定义一个新模块,并添加服务提供商的模拟)
app.module('angulartics', []);
配置您的 karma.conf.js 以使用您的模块模拟:
files = [
....
'scripts/mocks/*.js',
...
'scripts/specs/*.spec.js'
]
2。或者,在某些地方模拟你的模块
beforeEach(function(){
module('moduleToMock');
module(function ($provide) {
$provide.value('yourService', serviceMock);
});
});
Is there a reason why Karma fails on 3rd party DOM providers? Is there
a DOM ready on time?
你在进行单元测试,所以,你是在孤立地测试东西,漏洞应用不会运行。您决定执行和测试什么。
我有一个正在运行的 AngularJS 项目,我是第一次配置 Karma。
这个测试有效:
describe('myFactory', function () {
// Load your module.
beforeEach(module('MyApp'));
it('can get an instance of my factory', inject(function(sampleSvc) {
expect(sampleSvc).toBeDefined();
}));
});
此测试无效:
describe('myFactory', function () {
// Load your module.
beforeEach(module('MyApp'));
// Setup the mock service in an anonymous module.
beforeEach(module(function ($provide) {
$provide.service('$window', function(){
this.alert= jasmine.createSpy('alert');
});
}));
it('can get an instance of my factory', inject(function(sampleSvc) {
expect(sampleSvc).toBeDefined();
}));
});
第 3 方角度分析失败:
当我从 app.config 中删除 angulartics 时,它在热键上失败了:
这对我来说是新的。
- 我应该使用不同的 app.js 进行测试吗?
- Karma 在第 3 方 DOM 提供商上失败是否有原因?有DOM准时准备好的吗?
我的 app.js 配置部分:
app.config(['$routeProvider', '$translateProvider', 'i18n', '$analyticsProvider',
function ($routeProvider, $translateProvider, i18n, $analyticsProvider) {
$analyticsProvider.developerMode(true);
$analyticsProvider.firstPageview(true);
/* Records pages that don't use $state or $route */
$analyticsProvider.withAutoBase(true);
$routeProvider.
when('/welcome', {
templateUrl: 'partials/welcome/welcome.html',
controller: 'WelcomeCtrl'
}).
when('/main', {
templateUrl: 'partials/main/main.html',
controller: 'MainCtrl',
hotkeys: [
['tab', 'Add a new task', 'addNewEventByTab()']
]
}).
when('/migration', {
templateUrl: 'partials/migration/migration.html',
controller: 'MigrationCtrl'
}).
when('/loadingPage', {
templateUrl: 'partials/loadingPage/loadingPage.html',
controller: 'LoadingPageCtrl'
}).
when('/beta', {
templateUrl: 'partials/closedBeta/closedBeta.html',
controller: 'ClosedBetaCtrl'
}).
otherwise({
redirectTo: '/loadingPage'
});
}]);
Should I use a different app.js for testing?
1.全局模拟你的模块
(用于您所有的测试,但是,您将无法测试此模块)
- 在create中创建文件夹mocks/ moduleName.js
定义一个新模块,并添加服务提供商的模拟)
app.module('angulartics', []);
配置您的 karma.conf.js 以使用您的模块模拟:
files = [ .... 'scripts/mocks/*.js', ... 'scripts/specs/*.spec.js' ]
2。或者,在某些地方模拟你的模块
beforeEach(function(){
module('moduleToMock');
module(function ($provide) {
$provide.value('yourService', serviceMock);
});
});
Is there a reason why Karma fails on 3rd party DOM providers? Is there a DOM ready on time?
你在进行单元测试,所以,你是在孤立地测试东西,漏洞应用不会运行。您决定执行和测试什么。