Unidade testando um controlador modalInstance com Karma / Jasmine
EDIT: Solução rápida e suja no final deste post
Estou usando uma janela modal do AngularUI-Bootstrap da mesma forma que é explicada no site, exceto que eu dividi os arquivos. Portanto eu tenho:
CallingController.js:
$scope.delete = function () {
if ($scope.selected.length > 0) {
// [...]
// preparing data
// [...]
var modalInstance = $modal.open({
templateUrl: 'views/modalView.html',
controller: 'modalCtrl',
resolve: {
itemArray: function () {
return $scope.selected;
}
}
});
modalInstance.result.then(function (confirm) {
if (confirm === true) {
// [...]
// treat
// [...]
}
});
}
};
modalController.js:
myAppControllers.controller('modalCtrl',
function ($scope, $modalInstance, itemArray) {
$scope.accept = function () {
$modalInstance.close(true);
};
$scope.reject = function () {
$modalInstance.close(false);
};
$scope.itemArray = itemArray;
});
e quando eu testar esse código com Karma (com oui-bootstrap-tpls.min.js arquivo carregado no arquivo de configuração do karma), recebo o seguinte erro:Erro: [$ injector: despr] [http://errors.angularjs.org/1.2.15-build.2389+sha.c5f2f58/$ injector / unf? p0 =% 24modalInstanceProvider% 20% 3C-% 20% 24modalInstance]1 em erro (nativo), o que significa que o jasmim não consegue encontrar o provedor para $ modalInstance.
Ainda não testei coisas neste controlador, ainda não, mas aqui está o meu arquivo de teste de jasmim:
testModalController.js:
describe('Controller: modalCtrl', function () {
beforeEach(module('myApp'));
var Ctrl;
var scope;
// Initialize the controller and a mock scope
beforeEach(inject(
function ($controller, $rootScope) {
scope = $rootScope.$new();
Ctrl = $controller('modalCtrl', { $scope: scope });
})
);
describe('Initial state', function () {
it('should instantiate the controller properly', function () {
expect(Ctrl).not.toBeUndefined();
});
it('should initialize its values properly', function () {
});
});
});
Você tem alguma pista sobre esse problema? Não é o primeiro módulo "externo" que eu uso (e teste) e fiz as mesmas coisas que para os outros, exceto que desta vez não funciona e não tenho idéia do porquê.
==========================================
EDIT: Solução rápida e provavelmente suja:
Tudo bem, com base no método de escopo de escopo na instanciação do controlador do Jasmine, eu descobri como poderia "resolver" meu problema, mas provavelmente é bastante sujo, então fique à vontade para comentar se você encontrar uma maneira melhor de fazer o que pretendo .
testModalController.js:
describe('Controller: modalCtrl', function () {
beforeEach(module('myApp'));
var Ctrl;
var scope;
var modalInstance;
// Initialize the controller and a mock scope
beforeEach(inject(
function ($controller, $rootScope, _$modal_) {
scope = $rootScope.$new();
modalInstance = _$modal_.open({
templateUrl: 'views/modalView.html'
});
Ctrl = $controller('modalCtrl', {
$scope: scope,
$modalInstance: modalInstance,
itemArray: function () { return ['a', 'b', 'c']; }
});
})
);
describe('Initial state', function () {
it('should instantiate the controller properly', function () {
expect(Ctrl).not.toBeUndefined();
});
it('should initialize its values properly', function () {
});
});
});
Dessa forma, o Jasmine não procura mais fornecedores, porque você já injetou os itens que deveriam estar precisando desses fornecedores. Funciona, mas acredito que poderia ser feito de uma maneira melhor ...