javascript - Angular Jasmine UI 路由器将解析值注入(inject)测试

标签 javascript angularjs jasmine angular-ui-router karma-runner

在我的 Angular 应用程序中,UI 路由器将 promise 解析为 Controller 。当尝试测试这个 Controller 时,Karma 提示一个未知的 vendor 。如何将假对象注入(inject)测试以表示此解析对象。

我的应用代码如下所示:

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

我试过创建一个 spy 并注入(inject)它,但这不起作用。这是我目前的测试:

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

最佳答案

由于单元测试中不涉及路由,因此您必须将 allTemplates 作为具有 $controller 函数的普通对象注入(inject)。你能试试吗:

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

否则,您可以使用 $provide API 创建虚拟服务。

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

在您的 beforEach block 中做第一件事。

关于javascript - Angular Jasmine UI 路由器将解析值注入(inject)测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28557749/

相关文章:

javascript - 从 url 中删除 guid 字符串

javascript - jQuery Cycle Plugin 回调错误

javascript - 只用一行的自闭元素条件元素?

javascript - 使用 Karma-Jasmine 读取二进制文件

node.js - jasmine-node waitsFor() 停止所有 future 的运行()

javascript - 如何将(Cordova)插件与 Ionic 2/TypeScript 一起使用?

angularjs - 如何使用angularjs从表中获取行数据

javascript - Angular 模块名称全局声明和重用

javascript - 如何在angularjs中对ng-disabled进行检查?

angularjs - Jasmine 使用 [^form] 依赖项测试 Angular 指令