Angular模块仅在测试时执行两次

时间:2015-04-21 15:58:34

标签: angularjs testing mocking phantomjs

我的角度应用程序在正常运行时工作正常,但在我进行单元测试(使用Karma& PhantomJS)时似乎执行了两次

它的实例如下:

bootstrap.js

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']);
    });
}

app.js

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;
    });
}]);

Test.js

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方法最接近的东西。运行块是需要运行以启动应用程序的代码。   它在所有服务配置完成后执行   注射器已创建。运行块通常包含代码   很难进行单元测试,因此应该单独声明   模块,以便在单元测试中可以忽略它们。

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

嗯,经过一个美好的夜晚,答案很简单......

因为我正在进行手动引导,所以在我的karma.conf文件中,我简单地排除了文件所在的位置。

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'
],