AngularJS 包含 $locationChangeStart 的单元测试控制器
AngularJS unit test controller with $locationChangeStart in it
我是 AngularJS 单元测试的新手。我想用茉莉花测试控制器中的功能。在同一个控制器中还有一个监视 $locationChangeStart
$scope.$on('$locationChangeStart', function(){
$scope.killTimer($scope.timer);
});
我不想测试这个,而是另一个功能。仍然当我尝试 运行 测试时,我得到一个错误,它指向 $scope.$on 行:
TypeError: undefined is not a function
我应该怎么做才能让测试没有运行这一行?我复制了我的测试规范,因为我不确定那里是否一切正常。
describe('invoiceListController', function() {
beforeEach(module('invoice'));
var $controller;
beforeEach(inject(function(_$controller_){
// The injector unwraps the underscores (_) from around the parameter names when matching
$controller = _$controller_;
}));
var $scope, controller;
beforeEach(function() {
$scope = {};
controller = $controller('invoiceList', { $scope: $scope });
});
describe('deleteInvoices()', function(){
it('should do nothing when no invoice is selected', function() {
$scope.invoicesToDelete = false;
var response = $scope.deleteInvoices();
expect(response).toEqual(false);
});
});
});
以及我要测试的代码:
$scope.deleteInvoices = function(){
if($scope.invoicesToDelete) {
return true;
} else {
return false;
}
};
Plunker 中的示例:Plunker
您目前的测试实际上不会 运行 通过范围,因为您需要在设置和 运行 宁范围功能后 $apply 。不过,这不会解决您未定义的问题,请检查您编写的函数是否可用于您的测试($scope.killTimer)。可能是 killTimer 函数中的某些东西出错了。
即
it('should do nothing when no invoice is selected', function() {
$scope.invoicesToDelete = false;
var response = $scope.deleteInvoices();
$scope.$apply();
expect(response).toEqual(false);
});
更新
在查看您的 plunkr 之后,实际上是您在测试中的范围实现是错误的,通过修复此问题,整个测试用例按预期工作。
$scope = $rootScope.$new();
是您应该注入控制器以正确实现范围的内容。我在这里更新了你的 plunker。
http://plnkr.co/edit/p3LShkxT12B1qw7fNbEb?p=preview
我是 AngularJS 单元测试的新手。我想用茉莉花测试控制器中的功能。在同一个控制器中还有一个监视 $locationChangeStart
$scope.$on('$locationChangeStart', function(){
$scope.killTimer($scope.timer);
});
我不想测试这个,而是另一个功能。仍然当我尝试 运行 测试时,我得到一个错误,它指向 $scope.$on 行:
TypeError: undefined is not a function
我应该怎么做才能让测试没有运行这一行?我复制了我的测试规范,因为我不确定那里是否一切正常。
describe('invoiceListController', function() {
beforeEach(module('invoice'));
var $controller;
beforeEach(inject(function(_$controller_){
// The injector unwraps the underscores (_) from around the parameter names when matching
$controller = _$controller_;
}));
var $scope, controller;
beforeEach(function() {
$scope = {};
controller = $controller('invoiceList', { $scope: $scope });
});
describe('deleteInvoices()', function(){
it('should do nothing when no invoice is selected', function() {
$scope.invoicesToDelete = false;
var response = $scope.deleteInvoices();
expect(response).toEqual(false);
});
});
});
以及我要测试的代码:
$scope.deleteInvoices = function(){
if($scope.invoicesToDelete) {
return true;
} else {
return false;
}
};
Plunker 中的示例:Plunker
您目前的测试实际上不会 运行 通过范围,因为您需要在设置和 运行 宁范围功能后 $apply 。不过,这不会解决您未定义的问题,请检查您编写的函数是否可用于您的测试($scope.killTimer)。可能是 killTimer 函数中的某些东西出错了。
即
it('should do nothing when no invoice is selected', function() {
$scope.invoicesToDelete = false;
var response = $scope.deleteInvoices();
$scope.$apply();
expect(response).toEqual(false);
});
更新 在查看您的 plunkr 之后,实际上是您在测试中的范围实现是错误的,通过修复此问题,整个测试用例按预期工作。
$scope = $rootScope.$new();
是您应该注入控制器以正确实现范围的内容。我在这里更新了你的 plunker。 http://plnkr.co/edit/p3LShkxT12B1qw7fNbEb?p=preview