如何在茉莉花上测试这个模块?
问题是测试$controller
非常困难,因为函数隐藏在闭包内,测试它们非常困难。
换句话说,鉴于下面的模块定义,为MainCtrl编写单元测试似乎是不可能的。
(function () {
'use strict';
angular.module('app', []);
function MainCtrl() {
var mc = this;
mc.obj = {
val : 50
};
}
angular.module('app').controller('MainCtrl', MainCtrl);
} () );
和“典型的”茉莉花测试
describe('app', function(){
beforeEach(module('app'));
it('should create an objet with val 50', inject(function(_$controller_) {
var scope = {},
ctrl = _$controller_('MainCtrl', {$scope:scope});
expect(scope.obj.val).toBe(50); // returns Expected undefined to be 50.
}));
});
当角度在jasmine测试函数中注入_$controller_
服务时,创建的控制器实例返回一个未定义的$ scope。
那你怎么测试呢?
我在StackOverflow上搜索此问题的解决方案,但没有给出我正在寻找的答案,所以我实现了自己的一个。
答案 0 :(得分:1)
只需这样就可以用茉莉花进行测试:
describe('app', function () {
var $controller;
beforeEach(function () {
module('app');
inject(function (_$controller_) {
$controller = _$controller_('MainCtrl');
});
});
//-- spec - test controller
describe('Controller : MainCtrl', function () {
it('should create an object with val 50', function () {
expect($controller.obj.val).toBe(50);
});
});
});
这里有一个jsfiddle
希望它有所帮助!
答案 1 :(得分:0)
问题出在这里
var scope = {},
ctrl = _$controller_('MainCtrl', {$scope:scope});
您正在导入未定义的范围。你需要做这样的事情:
注入$rootScope
:
inject(function (_$controller_, _$rootScope_)
构建新范围:
var scope = $rootScope.$new();
构建控制器:
var ctrl = _$controller_('MainCtrl', {$scope: scope});