2013-03-01 4 views
3

У меня есть директива, которая использует службы:директивы испытания AngularJS, которые непосредственно потребляющие услуги

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() 

ответ

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. */ }; 
     } 
    }); 
});