我正在尝试在一个模块中对控制器代码进行单元测试,该模块将其他模块作为依赖项,但是无法弄清楚如何正确地模拟它们。
我正在使用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是“没有模块af.widgets”,所以显然我并没有正确地模仿模块依赖。任何提示?
答案 0 :(得分:64)
如果你想模拟一个声明一个或多个服务的模块,我已经使用过这段代码:
beforeEach(function(){
module('moduleToMock');
module(function ($provide) {
$provide.value('yourService', serviceMock);
});
});
如果您要模拟的服务也是您要进行单元测试的服务(在另一个茉莉花描述中),这将非常有用。
fscof提出的解决方案很好,但您无法为angular-table
模块创建单元测试。
答案 1 :(得分:46)
以下是我的想法:
我没有在我的karma.conf.js文件中加载任何'angular-table'模块,因此出错了。这是故意的,因为我想在没有实际表模块的情况下测试'events'模块。
我能够通过在我的测试文件夹中创建一个名为'mocks / angular-table.js'的新文件来轻松模拟'angular-table'模块,并添加了以下代码:
<强> /mocks/angular-table.js 强>
'use-strict';
angular.module('angular-table', []);
我将此文件添加到我的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.
]
...
最后在我的spec文件中,我可以通过在beforeEach块中单独调用它们来添加这两个模块:
specs / events.spec.js
beforeEach(function(){
module('angular-table');
module('events');
});
我有了从this post
以这种方式构建文件的想法答案 2 :(得分:3)
我最近发布了ngImprovedTesting,它可以让AngularJS中的模拟测试变得更容易。
在您的情况下,只需在Jasmine测试中使用以下内容:
beforeEach(ModuleBuilder.forModule('events').serviceWithMocks('eventsCtrl').build());
有关ngImprovedTesting的更多信息,请查看其介绍性博客文章:http://blog.jdriven.com/2014/07/ng-improved-testing-mock-testing-for-angularjs-made-easy/