Angular Jasmine UI router вводит значение разрешения в тест - программирование

Angular Jasmine UI router вводит значение разрешения в тест

В моем приложении Angular маршрутизатор пользовательского интерфейса разрешает обещание в контроллере. При попытке проверить этот контроллер Karma жалуется на неизвестного провайдера. Как я вставляю поддельный объект в тест для представления этого объекта разрешения.

Мой код приложения выглядит примерно так:

angular.module('myapp')
.config(function($stateProvider, $urlRouterProvider) {
    $stateProvider
    .state('tab.name', {
        ...
        resolve: {
            allTemplates: function(Templates) {
                return Templates.all().then(function(templates) {
                    return templates;
                });
            }
        }
    })
})
.controller('QueriesCtrl', function(allTemplates, UserQuery) {
    var vm = this;
    vm.queries = allTemplates;
    vm.goToUrl = function(index, data) {
        var processedUrl = UserQuery.process(data, vm.queryTyped[index]);
        UserQuery.goToUrl(processedUrl);
    };
});

При попытке запуска тестов я получаю сообщение об ошибке

Unknown provider: allTemplatesProvider <- allTemplates <- QueriesCtrl

Я пробовал создавать шпиона и вводить его, но это не работает. Здесь мой тест на данный момент:

describe('Unit: queriesCtrl', function() {
    var controller,
        scope,
        UserQuery;

    beforeEach(function() {
        module('myapp');
        inject(function($injector) {
            UserQuery = $injector.get('UserQuery');
            allTemplates = jasmine.createSpyObj('allTemplates', [{a:1}, {a:2}, {b:3}]);
        });
    });

    describe('goToUrl', function() {
        beforeEach(inject(function ($rootScope, $controller) {
            scope = $rootScope.$new();
            controller = $controller('QueriesCtrl as ctrl', {
                '$scope': scope
            });
        }));
        it('should call UserQuery.process()', function() {
            spyOn(UserQuery, 'process');
            scope.ctrl.goToUrl();
            expect(UserQuery.process).toHaveBeenCalled();
        });
    });
});
4b9b3361

Ответ 1

Поскольку в unit test нет маршрута, вам нужно будет ввести allTemplates в качестве обычного объекта с помощью функции $controller. Можете ли вы попробовать:

controller = $controller('QueriesCtrl as ctrl', {
                '$scope': scope,
                 'allTemplates':allTemplates 
            });

Иначе вы можете использовать API $provide для создания фиктивной службы.

 module(function ($provide) {
    $provide.value("allTemplates", {[{a:1}, {a:2}, {b:3}]});

Сделайте это первым в своем блоке beforEach.