7

コントローラーを持っていて、Jasmine でテストしたいと思っています。テストしたいコントローラーのスコープに $on リスナーがあります。$emit イベントをトリガーして $on リスナーを実行するにはどうすればよいですか?

myApp.controller('superCtrl', function ($scope) {
    $scope.hero = 'Rafael ninja turtle';

    $scope.$on('change_hero', function (event, new_hero) {
        $scope.hero = new_hero;
    });
});

「change_hero」イベントが発生したときに $on リスナーが適切に機能することをテストします。

describe('Super controller', function () {
    var $scope,
        super_controller;

    beforeEach(function(){

        module('myApp');

        inject(function($rootScope, $controller){
            $scope = $rootScope.$new();

            super_controller = $controller('superCtrl', {$scope: $scope});

            spyOn($scope, '$on');
        });

    });

    it('should change change hero on change_hero event', function (){

        var new_hero = 'Ralf ninja turtle',
            sub_scope = $scope.$new();

        sub_scope.$emit('change_hero', new_hero);

        expect($scope.$on).toHaveBeenCalled();
        expect($scope.hero).toBe('Ralf ninja turtle');
    });

});
4

1 に答える 1

8

コントローラーを作成する前に、spyOn を呼び出す必要があるようです。また、 andCallThrough() を呼び出す必要があります。そうしないと、実際のメソッドが呼び出されず、テストが失敗します

于 2013-11-08T13:29:57.060 に答える