Comment injecter un service dans une directive de l'unité de test en AngularJS

J'ai besoin de tester une directive qui fait des appels à des injecté services.
Le morceau de code suivant est un exemple de directive, qui écoute les événements, et redirige le navigateur si la touche entrée est pressée à l'intérieur d'un élément spécifié.

Edit: j'ai l'impression que j'ai peut-être marcher dans E2E tests de terre?

angular.module('fooApp')
  .directive('gotoOnEnter', ['$location', function ($location) {

    var _linkFn = function link(scope, element, attrs) {

        element.off('keypress').on('keypress', function(e) {
                  if(e.keyCode === 13)
                  {
                       $location.path(scope.redirectUrl);
                  }
              });
    }

    return {
      restrict: 'A',
      link: _linkFn
    };
  }]);

Le problème est que je n'ai pas compris comment injecter des services de l'espionnage sur eux dans les directives.

Ma solution proposée ressemble à ceci:
Il ne fonctionne pas comme prévu, car je n'ai pas réussi à injecter un $locacion réussi à espionner.

describe('Directive: gotoOnEnter', function () {
  beforeEach(module('fooApp'));

  var element;

  it('should visit the link in scope.url when enter is pressed', inject(function ($rootScope, $compile, $location) {

    element = angular.element('<input type="text" goto-on-enter>');
    element = $compile(element)($rootScope);

    $rootScope.redirectUrl = 'http://www.google.com';
    $rootScope.$digest();

    var e = jQuery.Event('keypress');
    e.keyCode = 13;
    element.trigger(e);

    spyOn($location, 'path');

    expect($location.path).toHaveBeenCalledWith('http://www.google.com');
  }));

Cela donne

Expected spy path to have been called with [ 'http://www.google.com' ] but it was never called.
  • Vous devez créer l'espion avant d'essayer de naviguer. Je crois que si vous vous déplacez à l'appel à 'spyOn' vers le haut de la fonction, il fonctionne comme prévu.