【发布时间】:2013-01-07 19:33:45
【问题描述】:
我已经阅读了一些教程和基本示例,但我很难为我的控制器编写单元测试。我已经看到代码 sn-ps 实例化控制器并让 angular 注入 $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 的方法效果很好。
【问题讨论】:
-
我的茉莉花测试在注入方法上中断。没有找到。我错过了什么。角度不为空。我有一个通过验证它已加载的测试。
标签: javascript angularjs jasmine