我已经阅读了一些教程和基本示例,但我很难为我的控制器编写单元测试。我已经看到代码片段实例化控制器并让角度注入$rootScope
对象,该对象又用于为控制器创建新scope
对象。但我不知道为什么ctrl.$scope
?未定义:
describe('EmployeeCtrl', function () {
var scope, ctrl, $httpBackend;
beforeEach(inject(function (_$httpBackend_, $rootScope, $controller, $filter) {
$httpBackend = _$httpBackend_;
scope = $rootScope.$new();
ctrl = $controller('EmployeeCtrl', { $scope: scope});
expect(ctrl).not.toBeUndefined();
expect(scope).not.toBeUndefined(); //<-- PASS!
expect(ctrl.$scope).not.toBeUndefined(); //<-- FAIL!
}));
});
我最终使用了scope
变量而不是,ctrl.$scope
但是在我的第一次测试中,我无法弄清楚如何在我的控制器中对函数变量进行单元测试:
控制器:
function EmployeeCtrl($scope, $http, $filter, Employee) {
var searchMatch = function (haystack, needle) {
return false;
}
}
破碎的单元测试:
it('should search ', function () {
expect(ctrl.searchMatch('numbers','one')).toBe(false);
});
这就是我得到的
TypeError: Object # has no method 'searchMatch'
您如何测试该功能?作为一种解决方法,我将我的方法移动到 $scope 以便我可以测试,scope.searchMatch
但我想知道这是否是唯一的方法。
最后,在我的测试中似乎$filter
也未定义,你如何注入它?我试过这个但没有奏效:
ctrl = $controller('EmployeeCtrl', { $scope: scope, $filter: $filter });
谢谢
更新: 上面提到的注入 $filter 的方法工作得很好。