一尘不染

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

angularjs

我试图在将其他模块作为依赖项的模块中进行单元测试控制器代码的单元化,但是还没有弄清楚如何正确模拟它们。

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

模块代码

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

app.controller('eventsCtrl', function([dependencies]){
    $scope.events = [];
    ...
});

规格代码

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

我得到的错误是Karma是“ no module af.widgets”,因此显然我没有对模块依赖项进行模拟。有什么提示吗?


阅读 226

收藏
2020-07-04

共1个答案

一尘不染

如果要模拟声明一个或多个服务的模块,请使用以下代码:

beforeEach(function(){
    module('moduleToMock');
    module(function ($provide) {
        $provide.value('yourService', serviceMock);
    });
});

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

2020-07-04