2016-03-23 7 views
1

definiert wird. Mit angularem 1.4.8 und Karma 0.13.19 möchte ich einen $ on Callback auslösen, der in einem Link definiert ist, um dann zu testen, dass er die Eigenschaften des Scopes entsprechend der Daten, die der Rückruf erhält.

Hier ist meine Richtlinie

(function() { 
    'use strict'; 

    angular.module('error').directive('errorPopup', function() { 
    return { 
     restrict: 'AE', 
     replace: true, 
     scope: {}, 
     templateUrl: 'components/error/error_popup-template.html', 
     link: function (scope, element, attrs) { 
      scope.$on('_REQUEST_ERROR_', function (event, response) { 
       scope.error = response; 
       console.log('on _REQUEST_ERROR_; scope.error: ', scope.error); 
       element.modal(); 
      }); 
     } 
    }; 
    }); 
})(); 

hier mein Test

describe('Error-Popup Directive', function(){ 
    var $templateCache, 
    scope, 
    element, 
    elementScope, 
    $compile, 
    listener = {}, 
    response; 

    beforeEach(module('error')); 

    beforeEach(inject(function ($templateCache, $compile, $rootScope) { 
    response = { 
     'data': { 
      'code': 'INVALID_AUTH_TOKEN', 
      'message': 'Authentication token is missing' 
     } 
    }; 
    $templateCache.put('components/error/error_popup-template.html', '<div>some html</div>'); 
    element = angular.element('<error-popup></error-popup>'); 

    scope = $rootScope.$new(); 

    // elementScope = element.scope; 
    spyOn(scope, '$on').and.callFake(function(event, callback) { 
     // Store event listeners for later access. 
     console.log('event:', event); 
     listener[event] = callback; 
     console.log('listener['+event+']:', listener[event]); 
    }); 

    $compile(element)(scope); 
    scope.$digest(); 
    })); 

    describe('scope.$on(\'_REQUEST_ERROR_\', callback)', function(){ 
    beforeEach(function(){ 
     listener['_REQUEST_ERROR_']({}, response); 
     console.log('scope:', scope); 
    }); 

    it('should set scope.error to response', function() { 
     expect(scope.error).toEqual(response); 
    }); 
    }); 
}); 

Aber ich bin TypeError: 'undefined' is not a function (evaluating 'listener['_REQUEST_ERROR_']({}, response)' immer

Es ist wie Link-Funktion sieht heißt nie Umfang ist so. $ Auf .

Hat jemand eine Idee, wie ich das erreichen könnte? Danke

Antwort

1

Der Spyon funktioniert nicht, weil die Link-Funktion vor Jasmine Spion ausgeführt wird.

Wenn Sie es wirklich testen möchten, können Sie das Ereignis in Ihrem Test übertragen und das Ereignishandler-Ergebnis überprüfen.

+0

Ich bin in der Lage, ein Ereignis zu senden, aber stellt fest, scope.error bleibt undefiniert, wenn sie es testen, auch nachdem es Listener-Callback durchlaufen und scope.error wurde ordnungsgemäß festgelegt (console.log attestiert es) – svassr

+0

haben Sie den Umfang tun . $ apply()? – sdfacre

+0

Nein, wann soll ich 'scope. $ apply()'? – svassr

Verwandte Themen