如何使用$ controller decorator模拟单向绑定参数?

时间:2016-05-04 13:05:09

标签: angularjs jasmine ngmock

我正在为指令控制器编写测试,其启动逻辑需要定义一些单向绑定参数。我遇到了将单向绑定参数传递给模拟控制器的困难。文本绑定参数可以毫无困难地传递。

注意:在以下代码中,我跳过了模块注入和代码中其他不相关的部分

以下是指令的定义,包含两种类型的参数:

function DummyDirective() {
  return {
    restrict: 'E',
    scope: {},
    bindToController: 
      oneWay: '&',
      text: '@'
    },
    templateUrl: 'path/to/template.html',
    controller: 'GreatController',
    controllerAs: 'vm'
  };
}

这是控制器:

function GreatController() {
    var vm = this;

    vm.treasure = '';

    activate();

    function activate() {
      vm.treasure = fantastic(vm.oneWay);
    }

    function fantastic(crap) {
      if(crap.stack) return 'gold';
    }
}

关于测试:

  var controller, $rootScope, $scope;
  beforeEach(inject(function(_$controller_, _$rootScope_){
    $rootScope = _$rootScope_;
    $scope = $rootScope.$new();

    controller = _$controller_(
      'GreatController',
      {$scope: $scope},
      {text: 'toGoodToBeTrue',
       oneWay: {
         stack: 'lotsOfIt',
       }
      }
    );
  }));

  it('should do the job', function(){
    expect(controller.treasure).toBe('gold');
  });

text正确传递给$ controller时,oneWay未定义且测试失败。我也尝试传递一个函数返回一个对象无济于事。 documentation不包含单向绑定参数。如果不测试指令并将参数作为标记传递,你知道怎么做吗?一般来说,我喜欢分开测试和测试指令及其控制器。

1 个答案:

答案 0 :(得分:0)

如果将oneWay设为可选,在其定义中添加问号,该怎么办:

oneWay: '&?'