Поэтому у меня есть такой декоратор приложение конфигурация:Как модульное тестирование пользовательского декоратора с жасмином (угловая 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() {}
}
все еще жду для некоторых лучших идей :-)
Спасибо, человек, вы положили меня на правильный путь :) Моя цель состояла в том, чтобы не проверить, существует ли свойство, но чтобы оно работало. $ scope = $ root. $ new(); - Я не знал, что вы можете создать область как это, так что я высмеивал $ scope как простой объект ... Который, очевидно, отсутствовал конструктор $ onRootScope, тогда ... Спасибо за ответ! – Tautvydas