我正在尝试将我的大脑包裹在AngularJS中的依赖注入中。让我们说这是我非常激动人心的应用程序代码:
function PrideRockCtrl($scope, King) {
$scope.king = King;
}
angular.module('Characters', ['ngResource'])
.factory('King', function() {
return "Mufasa";
});
我想测试PrideRockCtrl
。如果我按照文档和教程中的示例进行操作,我可以使用module('Characters')
配置注入器并使用inject()
来获取一些依赖项。即:
describe('Pride Rock', function() {
beforeEach(module('Characters'));
it('should be ruled by Simba', inject(function($rootScope, $controller) {
var scope = $rootScope.$new();
var ctrl = $controller(PrideRockCtrl, {$scope: scope});
expect(scope.king).toEqual("Mufasa");
}));
});
这很好用,但这不是交叉测试框架解决方案。 module()
和inject()
测试助手仅与Jasmine兼容。
module()
或inject()
的情况下手动完成相同依赖注入的最佳方法是什么?我想出了这个:
describe('Pride Rock', function() {
it('should be ruled by Mufasa', function() {
var $injector = angular.injector(['Characters']);
var $controller = $injector.get('$controller');
var scope = $injector.get('$rootScope').$new();
var king = $injector.get('King');
var ctrl = $controller(PrideRockCtrl, {$scope: scope, King: king});
expect(scope.king).toEqual("Mufasa");
});
});
这看起来非常冗长。还有更好的方法吗?
答案 0 :(得分:5)
最简单的版本,不使用模块,如下所示:
describe('Pride Rock', function() {
it('should be ruled by Simba', inject(function($rootScope, $controller) {
var scope = $rootScope.$new();
var ctrl = $controller(PrideRockCtrl, {
$scope: scope,
King:"Mufasa"
});
expect(scope.king).toEqual("Mufasa");
}));
});
事实上,你的尝试非常接近,唯一缺少的是控制器中的本地依赖(King:"Mufasa"
)。
在那些测试中,我们专注于一个选定的类,只是没有必要使用$ injector,因为我们可以手动模拟/存根我们的依赖项。在一天结束时,$ injector只是给出了对象的实例,所以我们也可以创建自己的对象。
答案 1 :(得分:4)
Angular控制器只是JS函数。如果你不想要注入任何东西,只需要打电话。
describe('king should be set', function() {
var scope = {};
var lion = "Simba";
PrideController(scope, lion);
expect(scope.king).toEqual(lion)
});