在Jasmine单元测试中模拟AngularJS模块依赖项

fsc*_*cof 71 unit-testing jasmine angularjs karma-runner

我试图在一个模块中对控制器代码进行单元测试,该模块将其他模块作为依赖项,但是无法弄清楚如何正确地模拟它们.

我正在使用Jasmine Framework并使用Karma(Testacular)运行我的测试.

模块代码

var app = angular.module('events', ['af.widgets', 'angular-table']);

app.controller('eventsCtrl', function([dependencies]){
    $scope.events = [];
    ...
});
Run Code Online (Sandbox Code Playgroud)

规格代码

describe('events module', function(){
    var $scope,
        ctrl;

    beforeEach(function(){
        angular.mock.module('af.widgets', []);
        angular.mock.module('angular-table', []);
        module('events', ['af.widgets', 'angular-table']);
    });

    beforeEach(inject(function($rootScope, $controller){
        $scope = $rootScope.new();
        ctrl = $controller('NameCtrl', {
            $scope: $scope,
        });
    }));

    it('should have an empty events array', function(){
        expect($scope.events).toBe([]);
    })
});
Run Code Online (Sandbox Code Playgroud)

我得到的错误是Karma是"没有模块af.widgets",所以显然我并没有正确地模仿模块依赖.任何提示?

Dav*_*rdi 65

如果你想模拟一个声明一个或多个服务的模块,我使用了这段代码:

beforeEach(function(){
    module('moduleToMock');
    module(function ($provide) {
        $provide.value('yourService', serviceMock);
    });
});
Run Code Online (Sandbox Code Playgroud)

如果要模拟的服务也是要进行单元测试的服务(在另一个茉莉花描述中),这将非常有用.fscof提出的解决方案很好,但您无法为angular-table模块创建单元测试.

  • 这是正确的方式.因为您通常不希望对所有测试使用一个模拟.Se也在这里:http://stackoverflow.com/a/18756347/1105860 (4认同)

fsc*_*cof 46

这是我想出的:

我没有在我的karma.conf.js文件中加载任何'angular-table'模块,因此出错.这是故意的,因为我想在没有实际表模块的情况下测试'events'模块.

通过在我的测试文件夹中创建一个名为'mocks/angular-table.js'的新文件,我可以轻松地模拟'angular-table'模块,并添加了以下代码:

/mocks/angular-table.js

'use-strict';
angular.module('angular-table', []);
Run Code Online (Sandbox Code Playgroud)

我将此文件添加到我的karma.conf.js文件中,以及我想要测试的真实"事件"模块:

karma.conf.js

...
files = [
    JASMINE,
    JASMINE_ADAPTER,
    'scripts/libs/angular.js',
    'scripts/libs/angular-mocks.js',
    'scripts/events.js', // this is the real module.
    'scripts/mocks/*.js', //loads all custom mocks.
    'scripts/specs/*.spec.js' // loads my spec file.
] 
...
Run Code Online (Sandbox Code Playgroud)

最后在我的spec文件中,我能够通过在beforeEach块中单独调用它们来添加两个模块:

规格/ events.spec.js

beforeEach(function(){
    module('angular-table');
    module('events');
});
Run Code Online (Sandbox Code Playgroud)

我想从这篇文章中以这种方式构建我的文件

  • 你不是通过调用angular.module来嘲笑'angular-table'模块吗?我想你想调用模块,因为angular-mocks将它附加到全局范围?无论哪种速度,谢谢你,因为这有助于我开始运行我的规格. (2认同)