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 时,它在热键上失败了:

这对我来说是新的。

  1. 我应该使用不同的 app.js 进行测试吗?
  2. 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?

你在进行单元测试,所以,你是在孤立地测试东西,漏洞应用不会运行。您决定执行和测试什么。