我的角度应用程序在正常运行时工作正常,但在我进行单元测试(使用Karma& PhantomJS)时似乎执行了两次
它的实例如下:
require('./app.js');
var app = document.URL.indexOf( 'http://' ) === -1 && document.URL.indexOf( 'https://' ) === -1;
if ( app ) {
console.log('App running on a mobile device');
document.addEventListener("deviceready", function(){
angular.bootstrap(document, ['esme']);
});
} else {
console.log("App running in a browser");
angular.element(document).ready(function() {
angular.bootstrap(document, ['esme']);
});
}
var esme = angular.module('esme', ['ui.router', 'ngAnimate', 'ngTouch', 'DataStore', 'angular-carousel', 'SessionParams', 'hmTouchEvents']);
esme.run(['$location', '$rootScope', '$state', 'NotificationManager', function($location, $rootScope, $state, NotificationManager) {
console.log('run');
NotificationManager.init();
$rootScope.$on('$locationChangeSuccess', function (event, current, previous) {
if($state.current.data)
$rootScope.title = $state.current.data.title;
});
}]);
describe('TestController', function() {
var $controller;
var $rootScope;
beforeEach(module('esme'));
beforeEach(module(function($urlRouterProvider) {
$urlRouterProvider.deferIntercept();
}));
beforeEach(inject(function(_$controller_, _$rootScope_){
// The injector unwraps the underscores (_) from around the parameter names when matching
$controller = _$controller_;
$rootScope = _$rootScope_.$new();
}));
describe('$scope.cheer', function() {
var $scope, controller;
beforeEach(function() {
$scope = $rootScope;
controller = $controller('Main', { $scope: $scope });
});
describe("#hello()", function(){
it('ensures hello is correct', function() {
$scope.test.should.equal('test');
});
});
});
});
浏览器控制台的输出如下:
"应用程序在浏览器中运行"
"配置"
"运行"
但是单元测试的输出如下:
INFO [karma]:Karma v0.12.31服务器始于http://localhost:9876/
[... Karma / PhantomJS的东西..]
日志:'应用程序在浏览器中运行'
警告[网络服务器]:404:/views/Main/Login.html
日志:' config'
LOG:'运行'
日志:' config'
日志:'运行'
PhantomJS 1.9.8(Windows 7):执行1次成功(0.007秒/0.001秒)
警告[网络服务器]:404:/views/Main/Login.html
[17:16:14]完成'测试:单位'在5.31 s之后
我还在学习如何模拟一个有角度的应用程序,所以我坚信我在测试文件中犯了一些明显的错误。能帮助我找到它们并解释为什么会发生这种行为?
我现在唯一的线索来自Angular's doc,我应该只为运行应用宣布一个模块吗?:
运行块 - 在创建注入器后执行并用于启动应用程序。只有实例和常量才可以 注入运行块。这是为了防止进一步的系统 在应用程序运行时配置。
运行块是Angular中与main方法最接近的东西。运行块是需要运行以启动应用程序的代码。 它在所有服务配置完成后执行 注射器已创建。运行块通常包含代码 很难进行单元测试,因此应该单独声明 模块,以便在单元测试中可以忽略它们。
感谢您的帮助!
答案 0 :(得分:0)
嗯,经过一个美好的夜晚,答案很简单......
因为我正在进行手动引导,所以在我的karma.conf文件中,我简单地排除了文件所在的位置。
files: [
'lib/angular-mocks/angular-mocks.js',
'src/js/**/*.js',
'test/test.js'
],
// list of files to exclude
exclude: [
'src/js/bootstrap.js'
],