$injector:unpr 未知提供者:modalInstanceProvider <- modalInstance

$injector:unpr Unknown provider: modalInstanceProvider <- modalInstance

我一直收到错误:[$injector:unpr] 未知提供者:modalInstanceProvider <- modalInstance 我觉得我非常接近能够从这个测试中继续前进,但我一直被卡住了。如果有人有任何提示,我将不胜感激。我在这个测试上花了几天时间,但运气不佳。

谢谢

Ctrl 测试

describe('DeleteModalController', function () {
    //make module avalible to tests
    beforeEach(module('pb.accounts.controllers'));
    beforeEach(module('ui.router'));
    beforeEach(module('ui.bootstrap'));

    var $controller;
    var mockGlobal = { activeOrganizationId: 0 };
    var mockStateParams = { orgId: 1, entityId: null };
    var mockForm = {};
    var mockState = {};

    var mockAccountSrv = {
        account: {
            entityId: 2,
            page: 19,
            length: 200
        },
        accounts: {
            entityId: 2,
            page: 19,
            length: 200
        }
    };

    // instantiating controller
    beforeEach(inject(function (_$controller_) {
        $controller = _$controller_;
    }));

    describe("Account service delete() function", function () {
        var controller, scope;


        // sets scope of controller before each test
        beforeEach(inject(function ($rootScope, _$modal_, _$modalInstance_) {
            scope = $rootScope.$new();
            controller = $controller('DeleteModalController',
                {
                    $modal: _$modal_,
                    modalInstance: _$modalInstance_,
                    $scope: scope,
                    $stateParams: mockStateParams,
                    $state: mockState,
                    global: mockGlobal,
                    accountService: mockAccountSrv
                });
        }));


        it("make sure service promise resolves", function () {
            scope.delete(mockAccountSrv.account);
            spyOn(modalInstance, "close");
            scope.$digest();

            expect(modalInstance.close).toHaveBeenCalled();
        });

    });

});

DeleteCtrl

angular.module('pb.accounts.controllers')
.controller('DeleteModalController', ['global', '$scope', 'accountService', '$modal', '$modalInstance', 'account', function (global, $scope, accountService, $modal, $modalInstance, account) {
    $scope.account = account;

    $scope.delete = function (account) {
        global.setFormSubmitInProgress(true);
        accountService.deleteAccount(global.activeOrganizationId, account.entityId).then(function () {
            global.setFormSubmitInProgress(false);
            $modalInstance.close();
        },
        function (errorData) {
            global.setFormSubmitInProgress(false);
        });
    };

    $scope.cancel = function () {
        global.setFormSubmitInProgress(false);
        $modalInstance.dismiss('cancel');
    };
}]);

账户控制

angular.module('pb.accounts.controllers')
    .controller('AccountsController', ['$scope', '$q', '$stateParams', '$state', '$timeout', '$modal', 'global', 'accountService', function ($scope, $q, $stateParams, $state, $timeout, $modal, global, accountService) {

        var init = function () {
            global.activeOrganizationId = $stateParams.orgId || 0;
            $scope.global = global;
            $scope.partialViews = {
                form: "/app/accounts/views/_form.html"
            };

            $scope.currentEntityId = $stateParams.entityId || 0;
        };

        init();

        $scope.getAll = function (page, length) {

            accountService.getAccounts(global.activeOrganizationId, page, length).then(function (data) {
                $scope.accounts = data;
            });

        };

        $scope.get = function (entityId) {

            accountService.getAccount(global.activeOrganizationId, entityId).then(function (data) {
                $scope.account = data;
            });

        };

        $scope.add = function (form, account) {
            form.submitIfValid(
                function () {
                    return accountService.createAccount(global.activeOrganizationId, account);
                }).then(function (data) {
                    $state.go('accounts.campaigns.list', { orgId: global.activeOrganizationId, accountId: data.entityId });
                });
        };

        $scope.edit = function (form, account) {
            form.submitIfValid(
                function () {
                    return accountService.updateAccount(global.activeOrganizationId, account)
                }).then(function (data) {
                    $state.go('accounts.campaigns.list', { orgId: global.activeOrganizationId, accountId: account.entityId });
                });
        };

        $scope.confirmDelete = function (account) {

            var modalInstance = $modal.open({
                templateUrl: '/app/accounts/views/_delete.html',
                controller: 'DeleteModalController',
                resolve: {
                    account: function () {
                        return account;
                    }
                }
                });


            modalInstance.result.then(function (asset) {
                $scope.getAll(1, 100);
            }, function () {
                console.log('Modal dismissed at: ' + new Date());
            });
        };

    }]);

我想你应该使用 $modalInstance 来初始化你的控制器而不是 modalInstance

controller = $controller('DeleteModalController', {
    $modal: _$modal_,
    $modalInstance: _$modalInstance_,
    $scope: scope,
    $stateParams: mockStateParams,
    $state: mockState,
    global: mockGlobal,
    accountService: mockAccountSrv
});

$modalInstance 是作为 $modal 调用的一部分创建的,它不是全局依赖项,因此您不能:

beforeEach(inject(function ($rootScope, _$modal_, _$modalInstance_) {

您需要做的是创建一个虚拟 $modalInstance 或具有与 $modalInstance.

相同功能的间谍

像这样:

modalInstance = {                    // Create a mock object using spies
        close: jasmine.createSpy('modalInstance.close'),
        dismiss: jasmine.createSpy('modalInstance.dismiss'),
        result: {
          then: jasmine.createSpy('modalInstance.result.then')
        }
      };

从此答案中删除Unit testing a modalInstance controller with Karma / Jasmine