Injetando controladores personalizados em um teste de unidade AngularJS

Problema

Você precisa injetar um objeto de controlador AngularJS personalizado em uma especificação de teste de unidade (Jasmine) para teste.

Solução

Existem muitas maneiras de injetar um objeto controlador personalizado em uma especificação de teste de unidade no AngularJS. O código de exemplo a seguir ilustra 3 maneiras de injetar o mesmo objeto de controlador personalizado em um caso de teste de unidade.

describe('myNameSpace.controllers', function() {
describe
('MyController', function() {
var scope, createController;

beforeEach
(module('myNameSpace.controllers'));

beforeEach
(inject(function($injector) {
var $rootScope = $injector.get('$rootScope');
scope
= $rootScope.$new();

var $controller = $injector.get('$controller');

createController
= function() {
return $controller('MyController', {
'$scope': scope
});
};
}));

it
('should be defined', function() {
var controller = createController();
expect
(controller).toBeTruthy();
});
});
});
describe('myNameSpace.controllers', function() {
describe
('MyController', function() {
var scope, createController;

beforeEach
(module('myNameSpace.controllers'));

beforeEach
(inject(function($controller) {
scope
= {};

createController
= function() {
return $controller('MyController', {
'$scope': scope
});
};
}));

it
('should be defined', function() {
var controller = createController();
expect
(controller).toBeTruthy();
});
});
});

Uma versão mais curta …

describe('myNameSpace.controllers', function() {
describe
('MyController', function() {
beforeEach
(module('myNameSpace.controllers'));

it
('should be defined', inject(function($controller) {
var scope = {};

var controller = $controller('MyController', {
'$scope': scope
});
expect
(controller).toBeTruthy();
}));
});
});