7

Próbuję napisać test jednostki, który zapewnia, że ​​poprawna zmienna jest wysyłana do właściwości resolve z ui.bootstrap.modal z komponentów Bootstrap Angular-UI . Oto co mam do tej pory:Jak przetestować właściwość 'resolve' w module Bootstrap Modal Angular-UI

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

Warto zauważyć, że nieruchomość resolve.name musi być funkcja składowa kątowa-UI pracować poprawnie - poprzednio próbowałem resolve: { name: name } ale to nie działa.

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

W tej chwili, to jest po prostu sprawdzenie, że nieruchomość resolve.name jest funkcją, ale to, co naprawdę chciałbym zrobić, to twierdzą, funkcja resolve.name zwraca Barney Rubble. Składnia ta oczywiście nie działa:

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

Wydaje się jakoś chcą szpiegować funkcji resolve.name sprawdzić nazwano z Barney Rubble ale nie mogę znaleźć sposób, aby to zrobić. Jakieś pomysły?

+0

może można zobaczyć: http://stackoverflow.com/questions/26853603/unit-testing-angular-bootstrap-modal/26942188 –

Odpowiedz

5

Więc wymyśliłem sposób, aby to zrobić.

zdefiniować funkcję 'prywatny' na $scope:

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

zmodyfikować oryginalny $scope funkcję nazywają to 'prywatny' metody:

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

zaktualizować swoje testy drwić z tej funkcji i powrót oryginalna wartość, następnie możesz przetestować, że została poprawnie przekazana.

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

to może być inne rozwiązanie: http://stackoverflow.com/ pytania/26853603/unit-testing-angular-bootstrap-modal/26942188 –

+1

jak napisać oddzielny test jednostkowy dla metody $ scope._resolve? – EnugulaS

Powiązane problemy