У меня есть два контроллера и служба. В первом контроллере я подписался на мероприятие, чтобы сделать что-то. Второй контроллер выполняет некоторые действия, и когда это делается, транслирует событие. См. Пример ниже, тайм-аут предназначен только для эмуляции длительных действий. Я хотел бы проверить, что hasLoaded установлен в true, используя Jasmine 2.0. Пожалуйста, сообщите.Как проверить действия, которые выполняются при обратном вызове с помощью Jasmine
var myApp = angular.module('MyApp', []);
myApp.controller('MyCtrl1', ['$scope', 'myService', function($scope, myService) {
$scope.hasLoaded = false;
$scope.fileName = '';
myService.onLoaded($scope, function(e, data){
// I want to test the following two lines, in the really the code here is much more complex
$scope.fileName = data.fileName;
$scope.hasLoaded = true;
});
}]);
myApp.controller('MyCtrl2', ['$rootScope', '$scope', '$timeout', 'myService', function($rootScope, $scope, $timeout, myService) {
$scope.isLoading = false;
$scope.title = 'Click me to load';
$scope.load = function(){
$scope.isLoading = true;
$scope.title = 'Loading, please wait...';
$timeout(function() {
$rootScope.$emit('loaded', { fileName: 'test.txt'});
}, 1000);
};
myService.onLoaded($scope, function(){
$scope.hasLoaded = true;
});
}]);
myApp.service('myService', ['$rootScope', function ($rootScope) {
this.onLoaded = function(scope, callback) {
var handler = $rootScope.$on('loaded', callback);
scope.$on('$destroy', handler);
};
}]);
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.5/angular.min.js"></script>
<div ng-app="MyApp">
<div ng-controller="MyCtrl1">
<div ng-show="hasLoaded">{{fileName}} loaded !!!</div>
</div>
<div ng-controller="MyCtrl2">
<button ng-click="load()" ng-hide="hasLoaded" ng-disabled="isLoading" ng-bind="title"></button>
</div>
</div>
UPDATE: Я добавил параметр в широковещательный вызов, чтобы сделать его более ближе к моему делу.
Спасибо, это то, что мне нужно. Не могли бы вы рассказать мне, почему нам нужно иметь $ scope. $ Apply(); вызов? – Antipod
На самом деле вы этого не делаете. Я просто привык делать это, потому что в последнее время я тестировал макет обещаний, для которых требуется $ apply(), чтобы быть разрешенным в тесте. – mcgraphix