javascript - 访问 AngularJs 指令 Controller

标签 javascript angularjs unit-testing jasmine karma-runner

我在尝试使用 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/

相关文章:

javascript - Angularjs 与 css3 动画

c# - WebApi 2 中的单元测试 IAuthenticationFilter

python - 检索字符串以进行单元测试

javascript - 推送 document.ready 回调 : is it possible?

javascript - 是否可以在 browser/node.js 中获取 ES2015 模块名称?

javascript - 在输入中添加工具提示,angularjs

ios - 如何使用 Alamofire 为 http 请求编写单元测试?

javascript - .remove() 只删除 innerHTML 而不是我想要的整个标签

javascript - 动态创建异步函数

javascript - 仅在 AngularJS 中禁用左键单击焦点事件