单元测试 $scope.$on AngularJS
Unit Testing $scope.$on AngularJS
大家好,我正在努力测试 $.on 函数,我正在寻找有关此的任何建议或帮助:
控制器
$scope.$on("sampleFilesSelected", function(event, args) {
$scope.sampleFiles = args.newSampleFiles;
});
规格
describe('Testing a $.on', function() {
var $scope = null;
var ctrl = null;
beforeEach(module('test'));
it('should invoke myEvent when "myEvent" broadcasted', inject(function($rootScope, $controller) {
$scope = $rootScope.$new();
ctrl = $controller('MainCtrl', {
$scope: $scope
});
$scope.$broadcast('myEvent');
expect($scope.sampleFilesSelected).toBe(true);
}));
});
错误
TypeError: Unable to get property 'newSampleFiles' of undefined or null reference
undefined
您应该将一个值传递给您的事件,在断言之前调用 $digest :
$scope.$broadcast('myEvent', { 'newSampleFiles' : true } );
$scope.$digest();
expect($scope.sampleFilesSelected).toBe(true);
此代码...
$scope.$broadcast('myEvent');
没有传递任何参数,因此 args.newSampleFiles 抛出错误,因为参数未定义
你需要传递参数——我不知道你是怎么做到的
但是,我想说...单元测试用于测试控制器代码,而不是真正用于测试事件处理。你的例子有点极端。我很想使用 E2E 测试和量角器来测试事件处理。
我会重构如下...
$scope.$on("sampleFilesSelected", function(event, args) {
$scope.sampleFiles = args.newSampleFiles;
});
会变成...
$scope.myFunction = function(event, args) {
$scope.sampleFiles = args.newSampleFiles;
}
$scope.$on("sampleFilesSelected", $scope.myFunction);
我会单元测试 $scope.myFunction。并将 $scope.$on 的测试留给 E2E 量角器测试。
希望对您有所帮助
你犯了三个错误,第一个是你在控制器中 listening/subscribing 到一个名为 sampleFilesSelected
的事件,但在你的测试中,你正在向任何正在收听的人广播参加名为 myEvent
的活动?
其次,一旦上述问题得到解决,您应该在触发事件后 运行 $scope.$digest()
循环,然后您可以用您的 expect(...)
.
跟进它
第三,正如其他人所提到的,您应该在 $broadcast ...ing!
时将数据作为第二个参数传递
大家好,我正在努力测试 $.on 函数,我正在寻找有关此的任何建议或帮助:
控制器
$scope.$on("sampleFilesSelected", function(event, args) {
$scope.sampleFiles = args.newSampleFiles;
});
规格
describe('Testing a $.on', function() {
var $scope = null;
var ctrl = null;
beforeEach(module('test'));
it('should invoke myEvent when "myEvent" broadcasted', inject(function($rootScope, $controller) {
$scope = $rootScope.$new();
ctrl = $controller('MainCtrl', {
$scope: $scope
});
$scope.$broadcast('myEvent');
expect($scope.sampleFilesSelected).toBe(true);
}));
});
错误
TypeError: Unable to get property 'newSampleFiles' of undefined or null reference
undefined
您应该将一个值传递给您的事件,在断言之前调用 $digest :
$scope.$broadcast('myEvent', { 'newSampleFiles' : true } );
$scope.$digest();
expect($scope.sampleFilesSelected).toBe(true);
此代码...
$scope.$broadcast('myEvent');
没有传递任何参数,因此 args.newSampleFiles 抛出错误,因为参数未定义
你需要传递参数——我不知道你是怎么做到的
但是,我想说...单元测试用于测试控制器代码,而不是真正用于测试事件处理。你的例子有点极端。我很想使用 E2E 测试和量角器来测试事件处理。
我会重构如下...
$scope.$on("sampleFilesSelected", function(event, args) {
$scope.sampleFiles = args.newSampleFiles;
});
会变成...
$scope.myFunction = function(event, args) {
$scope.sampleFiles = args.newSampleFiles;
}
$scope.$on("sampleFilesSelected", $scope.myFunction);
我会单元测试 $scope.myFunction。并将 $scope.$on 的测试留给 E2E 量角器测试。
希望对您有所帮助
你犯了三个错误,第一个是你在控制器中 listening/subscribing 到一个名为 sampleFilesSelected
的事件,但在你的测试中,你正在向任何正在收听的人广播参加名为 myEvent
的活动?
其次,一旦上述问题得到解决,您应该在触发事件后 运行 $scope.$digest()
循环,然后您可以用您的 expect(...)
.
第三,正如其他人所提到的,您应该在 $broadcast ...ing!
时将数据作为第二个参数传递