Перемешивание $ modal в модульных тестах AngularJS

м написание модульного теста для контроллера, который запускает$modal и использует возвращенное обещание для выполнения некоторой логики. Я могу проверить родительский контроллер, который запускает $ modeal, но я могуt для жизни меня понять, как издеваться над успешным обещанием.

мы пробовали несколько способов, включая использование$q а также$scope.$apply() заставить решение обещания. Тем не менее, ближайший ямы получили что-то похожее на последний ответ вэтот ТАК сообщение; я

Я видел это несколько раз спросил с "старый» $dialog покадрово. Я могу'не могу найти много о том, как сделать это с "новый» $dialog покадрово.

Некоторые указатели будут оценены.

Чтобы проиллюстрировать проблему, ям, используяпример, представленный в документации по UI Bootstrapс некоторыми незначительными правками.

Контроллеры (основной и модальный)

'use strict';

angular.module('angularUiModalApp')
    .controller('MainCtrl', function($scope, $modal, $log) {
        $scope.items = ['item1', 'item2', 'item3'];

        $scope.open = function() {

            $scope.modalInstance = $modal.open({
                templateUrl: 'myModalContent.html',
                controller: 'ModalInstanceCtrl',
                resolve: {
                    items: function() {
                        return $scope.items;
                    }
                }
            });

            $scope.modalInstance.result.then(function(selectedItem) {
                $scope.selected = selectedItem;
            }, function() {
                $log.info('Modal dismissed at: ' + new Date());
            });
        };
    })
    .controller('ModalInstanceCtrl', function($scope, $modalInstance, items) {
        $scope.items = items;
        $scope.selected = {
            item: $scope.items[0]
        };

        $scope.ok = function() {
            $modalInstance.close($scope.selected.item);
        };

        $scope.cancel = function() {
            $modalInstance.dismiss('cancel');
        };
    });

Представление (main.html)


    
        
            I is a modal!
        
        
            
                
                    <a ng-click="selected.item = item">{{ item }}</a>
                
            
            Selected: {{ selected.item }}
        
        
            OK
            Cancel
        
    

    Open me!
    Selection from a modal: {{ selected }}

Тест

'use strict';

describe('Controller: MainCtrl', function() {

    // load the controller's module
    beforeEach(module('angularUiModalApp'));

    var MainCtrl,
        scope;

    var fakeModal = {
        open: function() {
            return {
                result: {
                    then: function(callback) {
                        callback("item1");
                    }
                }
            };
        }
    };

    beforeEach(inject(function($modal) {
        spyOn($modal, 'open').andReturn(fakeModal);
    }));


    // Initialize the controller and a mock scope
    beforeEach(inject(function($controller, $rootScope, _$modal_) {
        scope = $rootScope.$new();
        MainCtrl = $controller('MainCtrl', {
            $scope: scope,
            $modal: _$modal_
        });
    }));

    it('should show success when modal login returns success response', function() {
        expect(scope.items).toEqual(['item1', 'item2', 'item3']);

        // Mock out the modal closing, resolving with a selected item, say 1
        scope.open(); // Open the modal
        scope.modalInstance.close('item1');
        expect(scope.selected).toEqual('item1'); 
        // No dice (scope.selected) is not defined according to Jasmine.
    });
});

Ответы на вопрос(4)

Ваш ответ на вопрос