2015-07-09 1 views
2

Поэтому у меня есть такой декоратор приложение конфигурация:Как модульное тестирование пользовательского декоратора с жасмином (угловая JS)

angular.module('app').config(['$provide', function ($provide) { 

    $provide.decorator('$rootScope', ['$delegate', function ($delegate) { 
     $delegate.constructor.prototype.$onRootScope = function (name, listener) { 
      var unsubscribe = $delegate.$on(name, listener); 
      this.$on('$destroy', unsubscribe); 
     }; 

     $delegate.constructor.prototype.$watchRootScope = function (name, listener) { 
      var unsubscribe = $delegate.$watch(name, listener); 
      this.$on('$destroy', unsubscribe); 
     }; 

     $delegate.constructor.prototype.$watchAfterLoad = function (watchExpression, listener, objectEquality) { 
      var initialLoad = true; 
      this.$watch(watchExpression, function() { 
       if (initialLoad) { 
        // note: this obviously runs outside of angular, so sometimes the timeout could run after initial load 
        setTimeout(function() { initialLoad = false; }, 25); 
       } else { 
        listener.apply(this, arguments); 
       } 
      }, objectEquality); 
     }; 

     return $delegate; 
    }]); 

}]); 

Как вы можете видеть, этот декоратор позволяет мне использовать $ объем $ onRootScope вместо $ rootScope.. $ on и позаботится об удалении автоматических прослушивателей в области уничтожения события ...

Когда я тестирую свой код, в котором логика содержит $ scope. $ onRootScope Я получаю такую ​​ошибку: TypeError: undefined не является конструктором (оценивая «объем. $ onRootScope») в

Перед каждым испытанием я загружаю все необходимые модели и сделать инъекцию, которая выглядит следующим образом ~:

beforeEach(function() { 
    inject(function (_$rootScope_) { 
     $rootScope = _$rootScope_; 
    }); 
}); 

Как мне решить эту проблему? Есть ли способ издеваться/имитировать $ scope. $ OnRootScope?

Я совершенно новый для модульного тестирования & Жасмин извините за не очень красиво отформатированный вопрос.

EDIT # 1:

Как я насмехаясь мой объект $ сфера (вар $ объем = {...}) перед передачей его в качестве аргумента метода обслуживания, который я тестирую я могу избежать ошибка, просто определив метод $ Области применения:

$scope = { 
    ... 
    $onRootScope: function() {} 
} 

все еще жду для некоторых лучших идей :-)

ответ

2

Я считаю, что вам нужно, чтобы построить свой $scope основаны от декорированного $rootScope, в отличие от создания новый фиктивный объект.

Как так:

var $root, $scope; 

beforeEach(function() { 
    module('app'); 

    inject(function ($rootScope) { 
    $root = $rootScope; 
    $scope = $root.$new(); 
    }); 
}); 

it('should have the expected property', function() { 
    expect($scope.constructor.prototype).to.have.property('$watchRootScope'); 
}); 

Я швырнуть в ссылку на spec suite из мини-Lib я поставил вместе некоторое время назад, делая примерно то же самое, вы сейчас.

+0

Спасибо, человек, вы положили меня на правильный путь :) Моя цель состояла в том, чтобы не проверить, существует ли свойство, но чтобы оно работало. $ scope = $ root. $ new(); - Я не знал, что вы можете создать область как это, так что я высмеивал $ scope как простой объект ... Который, очевидно, отсутствовал конструктор $ onRootScope, тогда ... Спасибо за ответ! – Tautvydas