Unidad que prueba un controlador modalInstance con Karma / Jasmine

EDITAR: Solución rápida y sucia al final de esta publicación

Estoy usando una ventana modal de AngularUI-Bootstrap de la misma manera que se explica en el sitio web, excepto que dividí los archivos. Por lo tanto tengo:

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;

    });

y cuando pruebo este código con Karma (con elui-bootstrap-tpls.min.js archivo cargado en el archivo de configuración de karma), aparece el siguiente error:Error: [$ inyector: unpr] [http://errors.angularjs.org/1.2.15-build.2389+sha.c5f2f58/$ inyector / unpr? p0 =% 24modalInstanceProvider% 20% 3C-% 20% 24modalInstance]1 en error (nativo), lo que significa que Jasmine no logra encontrar el proveedor para $ modalInstance.

Ni siquiera pruebo cosas en este controlador, todavía no, pero aquí está mi archivo de prueba de jazmín:

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 () {

        });
    });

});

¿Tienes alguna pista sobre este problema? No es el primer módulo "externo" que uso (y pruebo), e hice lo mismo que para los demás, excepto que esta vez no funciona y no tengo idea de por qué.

==========================================

EDITAR: Solución rápida y probablemente sucia:

De acuerdo, en base al método de burla del alcance en la creación de instancias del controlador de Jasmine, descubrí cómo podría "resolver" mi problema, pero probablemente esté bastante sucio, así que siéntase libre de comentar si encuentra una mejor manera de hacer lo 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 () {

        });
    });

});

De esta manera, Jasmine ya no busca proveedores, porque ya inyectó los elementos que supuestamente los necesitan. Funciona, pero creo que podría hacerse de una mejor manera ...

Respuestas a la pregunta(3)

Su respuesta a la pregunta