Controlador angular de teste

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');
});

https://jsfiddle.net/ronapelbaum/pkhaxmdg/