AngularJS:Karma因app.config中定义的提供程序失败而需要DOM

时间:2015-09-29 01:16:00

标签: angularjs jasmine karma-jasmine

我有一个正在运行的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();
    }));
});

第三方愤怒失败:

Karma result

当我从app.config中删除angulartics时,它在热键上失败: enter image description here

这对我来说是新的。

  1. 我应该使用不同的app.js进行测试吗?
  2. 为什么Karma在第三方DOM提供商上失败了?是否有准备好的DOM?
  3. 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'
            });
    }]);
    

1 个答案:

答案 0 :(得分:1)

  

我应该使用不同的app.js进行测试吗?

<强> 1。全局模拟您的模块

(用于所有测试,但是,您将无法测试此模块)

  • 在create moduleName.js
  • 中创建文件夹mocks /
  • 定义,新模块,并添加服务提供程序的模拟)

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

为什么Karma在第三方DOM提供商上失败了?在那儿   一个DOM准时准备好了吗?

您正在进行单元测试,因此,您正在单独测试内容,洞穴应用程序将无法运行。你决定要执行什么和测试。