【问题标题】:Unit Testing Angular Attribute Directive单元测试角度属性指令
【发布时间】:2017-06-26 23:52:01
【问题描述】:

我在测试 AngularJS (1.5) 属性受限指令时遇到了一些问题。请参阅下面的示例指令和以下单元测试,其中会产生一个损坏的单元测试。

指令

(function (angular) {
  'use strict';

  function SomethingCtrl($filter) {
    return {
      restrict: 'A',
      require: 'ngModel',
      link: function(scope, element, attrs, ngModelController) {
        var exampleFilter = $filter('exampleFilter');
        ngModelController.$parsers.push(function(value) {
          ngModelController.$setViewValue(value);
          ngModelController.$render();
          return value;
        });
      }
    };
  }

  SomethingCtrl.$inject = ['$filter'];

  angular.module('something.formatter', [
    'filters'
  ]).directive('somethingFormatter', SomethingCtrl);
}(window.angular));

指令单元测试

fdescribe('something.formatter spec', function () {
  'use strict';
  var scope,
      element,
      testValue,
      compile,
      ngModelCtrl;

  beforeEach(function () {
    module('something.formatter');

    compile = function () {
      inject([
        '$compile',
        '$rootScope',
        function ($compile, $rootScope) {
          scope = $rootScope.$new();
          scope.testValue = testValue;
          element = angular.element('<input something-formatter ng-model="testValue"');
          $compile(element)(scope);
          ngModelCtrl = element.controller('ngModel');
          scope.$digest();
        }
      ]);
    };
  });
  describe('initialization', function () {
    beforeEach(function () {
      testValue = 'Yay!';
      compile();
      ngModelCtrl.$setViewValue('Nay?');
    });
    it('should be defined', function () {
      expect(scope.testValue).toEqual('Nay?');
    });
  });
});

我尝试按照以下说明操作:http://jsfiddle.net/mazan_robert/hdsjbm9n/

为了能够调用 ngModelController 上的方法,比如; $setViewValue。

然而,Jasmine 继续对我大喊大叫,并告诉我 $setViewValue 不是构造函数,甚至没有在实际指令中点击 console.logs。

TypeError: undefined is not an object (evaluating 'ngModelCtrl.$setViewValue')

想法?

非常感谢您的帮助!

【问题讨论】:

    标签: javascript angularjs unit-testing angularjs-directive jasmine


    【解决方案1】:

    关闭输入标签就可以了:

    element = angular.element('<input something-formatter ng-model="testValue" />');
    

    【讨论】:

    • 还是不行=/。 TypeError: undefined is not an object (evaluating 'ngModelCtrl.$setViewValue')。但是,这确实注销了元素,所以谢谢你的提示! :)
    猜你喜欢
    • 1970-01-01
    • 2018-09-04
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    • 2020-11-11
    • 2015-01-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多