Unit testing 使用Jasmine测试时,如何在控制器中的侦听器上触发$emit来测试$emit?
我有一个控制器,想用茉莉花测试一下。我要测试的控制器范围中有一个$on侦听器。如何触发$emit事件在侦听器上运行$Unit testing 使用Jasmine测试时,如何在控制器中的侦听器上触发$emit来测试$emit?,unit-testing,angularjs,jasmine,Unit Testing,Angularjs,Jasmine,我有一个控制器,想用茉莉花测试一下。我要测试的控制器范围中有一个$on侦听器。如何触发$emit事件在侦听器上运行$ myApp.controller('superCtrl', function ($scope) { $scope.hero = 'Rafael ninja turtle'; $scope.$on('change_hero', function (event, new_hero) { $scope.hero = new_hero; });
myApp.controller('superCtrl', function ($scope) {
$scope.hero = 'Rafael ninja turtle';
$scope.$on('change_hero', function (event, new_hero) {
$scope.hero = new_hero;
});
});
“change\u hero”事件发生时,侦听器上的Test$正常工作:
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');
});
});
看起来您需要在创建控制器之前调用spyOn。
另外,您应该调用andCallThrough(),否则将不会调用真正的方法,并且您的测试将失败这不起作用吗?我不清楚问题出在哪里?如果
$scope.hero
发生了变化,那么就不需要spyOn
了。这只是一个不来自现实生活的例子。让我们假设我需要检查was$on运行或notTest失败,错误为:error:预期已调用spy$on。在空。