我在尝试使用 jasmine 和 karma testrunner 进行单元测试的指令访问我的 Controller 时遇到了一些问题。该指令如下所示:
指令
angular.module('Common.accountSearch',['ngRoute'])
.directive('accountSearch', [function() {
return {
controllerAs: 'ctrl',
controller: function ($scope, $element, $routeParams, $http) {
this.setAccount = function () {
var response = { AccountId : $scope.ctrl.searchedAccount.AccountId }
$scope.callback(response)
}
this.getAccounts = function(searchText){
return $http.get('/api/CRMAccounts', {
params: {
retrievalLimit: 10,
search: searchText
}
}).then(function(response){
return response.data;
});
}
},
scope : {
config : '=',
values : '=',
callback : '='
},
templateUrl : '/common/components/account-search/account-search.html',
restrict : 'EAC'
}
}]);
这是到目前为止的测试用例文件,我相信一切都是正确的(我希望):
测试用例文件:
describe("Account search directive logic tests", function (){
var element,$scope,scope,controller,template
beforeEach(module("Common.accountSearch"))
beforeEach(inject( function (_$compile_, _$rootScope_,_$controller_,$templateCache) {
template = $templateCache.get("components/account-search/account-search.html")
$compile = _$compile_;
$rootScope = _$rootScope_;
$controller = _$controller_;
scope = $rootScope.$new();
element = $compile(template)(scope)
ctrl = element.controller
scope.$digest();
// httpBackend = _$httpBackend_;
}));
it(" sets the account and calls back.", inject(function () {
console.log(ctrl)
expect(ctrl).toBeDefined()
}));
//httpBackend.flush()
});
我已经设法将指令的 Controller (我认为)打印到返回以下不明确消息的控制台:
LOG: function (arg1, arg2) { ... }
我无法访问指令中的任何函数或属性,因为它们都返回“未定义”,我做错了什么?
最佳答案
指令 Controller 实际上是完全可注入(inject)的 - 无需提供构造函数,您只需按名称引用 Controller 即可。请在此处查看 Angular 的指令定义对象文档:https://docs.angularjs.org/api/ng/service/ $编译#指令定义对象
在您想要对 Controller 进行单元测试的情况下,您只需这样做:
common.accountSearch.js
angular.module('Common.accountSearch', [])
.directive('accountSearch', [function () {
return {
controller: 'accountSearchCtrl',
scope: {
config : '=',
values : '=',
callback : '='
},
templateUrl : '/common/components/account-search/account-search.html',
restrict: 'EAC'
}
}])
.controller('accountSearchCtrl', ['$scope', function ($scope) {
$scope.setAccount = function () {
var response = {
AccountId: $scope.ctrl.searchedAccount.AccountId
};
$scope.callback(response);
}
$scope.getAccounts = function (searchText) {
// Code goes here...
}
}]);
common.accountSearch-spec.js
describe("Account search directive logic tests", function () {
var controller, scope;
beforeEach(module("Common.accountSearch"));
beforeEach(inject(function (_$controller_, _$rootScope_) {
$rootScope = _$rootScope_;
scope = $rootScope.$new();
controller = _$controller_('accountSearchCtrl', { '$scope': scope });
}));
it(" sets the account and calls back.", function () {
expect(controller).toBeDefined();
});
});
通过这种方式,您可以像任何其他 Controller 一样将您的 Controller 直接注入(inject)到您的 jasmine 测试中。
希望这对您有所帮助。
关于javascript - 访问 AngularJs 指令 Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39954748/