Depois de ver como testar um serviço, vamos falar sobre como testar um controlador.
function MyController(MyService) {
this.greetUpperCase = function(name) {
return MyService.greet(name).toUpperCase();
}
}
Gostaríamos que o DI do angular injetasse uma instância do nosso controlador para nosso teste, mas os controladores não são únicos como serviços.
Portanto, iremos:
1. injetar o serviço $ controller
2. usá-lo para instanciar um controlador para nós
var $controller;
beforeEach(module('MyModule'));
beforeEach(inject(function(_$controller_) {
$controller = _$controller_;
}));
it("test greetUpperCase()", function() {
var ctrl = $controller('MyController');
expect(ctrl.greetUpperCase('bob')).toBe('HELLO BOB');
});
https://jsfiddle.net/ronapelbaum/tcmsw688/
Agora, se você ainda estiver trabalhando com $ scope:
function MyController($scope, MyService) {
$scope.greetUpperCase = function(name) {
return MyService.greet(name).toUpperCase();
}
}
Basicamente, quando você está trabalhando com $ scope, você realmente não se preocupa com o controlador em si, já que ele está fazendo tudo em seu escopo.
Portanto, precisaremos:
1. injetar $ rootScope
2. criar um novo escopo
3. injetá-lo em um novo controlador
4. testar o $ escopo
it("test greetUpperCase()", function() {
var $scope = $rootScope.$new();
$controller("MyController", {
$scope: $scope
});
expect($scope.greetUpperCase('bob')).toBe('HELLO BOB');
});