测试直接使用服务的AngularJS指令

时间:2013-03-01 15:37:50

标签: testing angularjs directive

我有一个使用服务的指令:

  MyDirective = (myService) ->

    compile: () ->
      stuff = myService.getStuff()

  MyDirective.$inject = ['MyService']

  app = A.module 'myApp'
  app.directive 'myDirective', MyDirective

我希望能够测试myService.getStuff是否被调用。

对于我对控制器的测试,我能够做到:

angular.mock.inject ($controller) ->
  myController = $controller 'MyController',
    $scope: $scope
    mockMe: mockMethod: () ->
      assert.ok()
      done()

如果我与我的指令类似,我会收到以下错误:

angular.mock.inject ($directive) ->
  myDirective = $directive 'MyDirective',
    $scope: $scope
    myService: getStuff: () ->
      assert.ok()
      done()

Error: Unknown provider: $directiveProvider <- $directive

我有什么想法可以获得对该指令的引用并将mocks注入其中?

在我正在做的所有测试之前:

angular.mock.module 'myApp'

我已经能够通过指令解决这个问题 - &gt;控制器 - &gt;服务而非指令 - &gt;服务。这是推荐的解决方案吗? e.g

$scope.getStuff = (name, success) ->
  assert.ok true
  done()

$_compile(elm) $scope
$scope.$digest()

1 个答案:

答案 0 :(得分:2)

这就是你在谈论的吗?

var scope, element;

angular.mock.inject(function ($compile, $rootScope) {
    scope = $rootScope;
    element = $compile('<my-directive />')(scope);
    scope.$digest();
});

您可以在此处对scope进行更改,再次致电$digest(),以查看element中反映的更改。如果myDirective通过注入依赖服务myService您想要模拟,则需要在拨打inject()之前执行此类操作:

module('moduleWithDirective', function ($provide) {
    $provide.provider('myService', {
        $get: function () {
            return { /* service goes here. */ };
        }
    });
});