Я просмотрел несколько руководств и основных примеров, но мне сложно записывать модульные тесты для моего контроллера. Я видел экземпляры сценариев создания экземпляров и позволяю angular вводить объект $rootScope
, который, в свою очередь, используется для создания нового объекта scope
для контроллера. Но я не могу понять, почему ctrl.$scope
? undefined:
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
, но затем в своем первом тесте я не мог понять, как unit test a функциональная переменная внутри моего контроллера:
Контроллер:
function EmployeeCtrl($scope, $http, $filter, Employee) {
var searchMatch = function (haystack, needle) {
return false;
}
}
Разбито unit test:
it('should search ', function () {
expect(ctrl.searchMatch('numbers','one')).toBe(false);
});
Это то, что я получаю
TypeError: Object # не имеет метода 'searchMatch'
Как вы проверяете эту функцию? В качестве обходного пути я переместил свой метод в $scope, чтобы проверить на scope.searchMatch
, но мне было интересно, является ли это единственным способом.
Наконец, в моих тестах появляется $filter
и undefined тоже, как вы его вводите? Я пробовал это, но не работал:
ctrl = $controller('EmployeeCtrl', { $scope: scope, $filter: $filter });
Спасибо
Update: Метод, упомянутый выше, для инъекции $filter работает очень хорошо.