2

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

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

以下是具有两种类型参数的指令定义:

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');
  });

Whiletext正确传递给 $controller,oneWay未定义且测试失败。我还尝试向它传递一个返回对象的函数,但无济于事。该文档不涵盖单向绑定参数。您知道如何在不测试指令并将参数作为标记传递的情况下执行此操作吗?一般来说,我喜欢让我的测试专注于测试指令和它们的控制器。

4

1 回答 1

0

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

oneWay: '&?'
于 2016-05-05T18:30:58.680 回答