Cómo probar unitariamente la propiedad 'resolver' en un componente Modal Bootstrap de Angular-UI

ui.bootstrap.modal escribir una testing unitaria que confirme que la variable correcta se envía a la propiedad de ui.bootstrap.modal de ui.bootstrap.modal desde los componentes Bootstrap de ui.bootstrap.modal angular. Esto es lo que tengo hasta ahora:

 // Controller angular.module('app') .controller('WorkflowListCtrl', function ($scope, $modal) { // Setup the edit callback to open a modal $scope.edit = function(name) { var modalInstance = $modal.open({ templateUrl: 'partials/editWorkflowModal.html', controller: 'WorkflowEditCtrl', scope: $scope, resolve: { name: function() { return name; } } }); }; }); 

Merece la pena señalar que la propiedad resolve.name debe ser una function para que el componente resolve.name angular funcione correctamente. Anteriormente había intentado resolve: { name: name } pero esto no funcionó.

 // Unit Test describe('Controller: WorkflowListCtrl', function () { // load the controller's module beforeEach(module('app')); var workflowListCtrl, scope, modal; // Initialize the controller and a mock scope beforeEach(inject(function ($controller, $rootScope) { scope = $rootScope.$new(); modal = { open: jasmine.createSpy() }; workflowListCtrl = $controller('WorkflowListCtrl', { $scope: scope, $modal: modal }); it('should allow a workflow to be edited', function() { // Edit workflow happens in a modal. scope.edit('Barney Rubble'); expect(modal.open).toHaveBeenCalledWith({ templateUrl: 'partials/editWorkflowModal.html', controller: 'WorkflowEditCtrl', scope: scope, resolve: { name: jasmine.any(Function) } }); }); })); }); 

Por el momento, esto solo está comprobando que la propiedad resolve.name es una function, pero lo que realmente me gustaría hacer es afirmar que la function resolve.name devuelve Barney Rubble . Esta syntax obviamente no funciona:

 expect(modal.open).toHaveBeenCalledWith({ templateUrl: 'partials/editWorkflowModal.html', controller: 'WorkflowEditCtrl', scope: scope, resolve: { name: function() { return 'Barney Rubble'; } } }); 

Parece que de alguna manera quiero espiar la function resolve.name para comprobar que se llamó con Barney Rubble pero no puedo encontrar una manera de hacerlo. ¿Algunas ideas?

Así que he descubierto una forma de hacer esto.

Defina una function 'privada' en $scope :

 $scope._resolve = function(item) { return function() { return item; }; }; 

Modifique la function $scope original para llamar a este método 'privado':

 $scope.edit = function(name) { var modalInstance = $modal.open({ templateUrl: 'partials/modal.html', controller: 'ModalCtrl', scope: $scope, resolve: { name: $scope._resolve(name) } }); }; 

Actualice sus testings para simular esta function y devuelva el valor original, luego puede probar que se pasó correctamente.

 it('should allow a workflow to be edited', function() { // Mock out the resolve fn and return our item spyOn($scope, '_resolve').and.callFake(function(item) { return item; }); // Edit workflow happens in a modal. scope.edit('Barney Rubble'); expect(modal.open).toHaveBeenCalledWith({ templateUrl: 'partials/modal.html', controller: 'ModalCtrl', scope: scope, resolve: { name: 'Barney Rubble' } }); });