Массив не является конструктором в модульном тесте JavaScript - PullRequest
0 голосов
/ 13 ноября 2018

У меня есть фабрика для создания диалога:

module myModule {
    export class myDialog {
        constructor(private $uibModal: ng.ui.bootstrap.IModalService) {}
        showDialog() {
            var options: ng.ui.bootstrap.IModalSettings = {
                templateUrl: '/dialog.html',
                size: "lg",
                controller: ['$scope', '$uibModalInstance', function($scope: any, $uibModalInstance: ng.ui.bootstrap.IModalServiceInstance) {
                    $scope.cancel = () => {
                        $uibModalInstance.close({
                            doAction: 'close'
                        });
                    }
                }],
                controllerAs: '$ctrl'
            };
            return this.$uibModal.open(options).result;
        }

        static factory(): any {
            const dialog = ($uibModal: ng.ui.bootstrap.IModalService) => new myDialog($uibModal);
            dialog.$inject = ['$uibModal'];
            return dialog;
        }
    };
    angular.module('myModule').factory('myDialog', myDialog.factory());
}

Как видите, для инъекции controller я использовал массив (аннотацию встроенного массива) для работы, когда файл javascript минимизирован.

Я создал тест, используя bardjs:

describe('My dialog service', function() {
    beforeEach(function() {
        module('myModule', function($provide) {
            $provide.factory('$uibModalInstance', function() {
                return {
                    close: function(result) {
                        return result;
                    }
                };
            });
        });
        module('myModule');
        bard.inject('$uibModal', '$uibModalInstance', '$http', '$httpBackend', '$q', '$rootScope', 'myDialog');
        bard.mockService($uibModal, {
            open: function(options) {
                return {
                    result: options
                };
            }
        });
        spyOn($uibModal, 'open').and.callThrough();
        spyOn($uibModalInstance, 'close').and.callThrough();
    });

    it('expect it to be defined', function() {
        expect(myDialog).toBeDefined();
    });
});

Но я получил ошибку:

TypeError: Массив не является конструктором (оценивает 'options.controller (scope, $uibModalInstance) ')

Почему?Как это решить?

1 Ответ

0 голосов
/ 13 ноября 2018

Объявите контроллер за пределами options объекта и используйте $ inject для внедрения зависимостей.

showDialog() {
    const ctrl = function($scope: any, $uibModalInstance: ng.ui.bootstrap.IModalServiceInstance) {
                $scope.cancel = () => {
                    $uibModalInstance.close({
                        doAction: 'close'
                    });
                }
            };
    ctrl.$inject = ['$scope', '$uibModalInstance'];

    var options: ng.ui.bootstrap.IModalSettings = {
            templateUrl: '/dialog.html',
            size: "lg",
            controller: ctrl,
            controllerAs: '$ctrl'
    };
    return this.$uibModal.open(options).result;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...