3

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

  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

有什么想法可以获取对指令的引用并将模拟注入其中吗?

在我做所有测试之前:

angular.mock.module 'myApp'

我已经能够通过指令 -> 控制器 -> 服务而不是指令 -> 服务来解决这个问题。这是推荐的解决方案吗?例如

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

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

1 回答 1

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. */ };
        }
    });
});
于 2013-05-11T12:07:36.903 回答