【问题标题】:Trying to test a factory and I am having injection issues试图测试一家工厂,但我遇到了注入问题
【发布时间】:2017-05-16 21:33:50
【问题描述】:

我对 Angular 和一般测试比较陌生。我正在尝试设置一个基本测试,在我开始尝试测试其他任何内容之前查看对象是否已定义。

我收到此错误:

错误:[$injector:unpr] 未知提供者:$stateParamsProvider

但是,当我尝试对其他测试文件进行此基本测试时,不会出现此错误。

工厂

angular.module('omnibyte_inspect_web.objects')
.factory('CommonQuestions', ['common_questions_factory', 'Form', '$rootScope',
    function (common_questions_factory, Form, $rootScope) {
    // Ctor
    function CommonQuestions(data) {
        var keys = Object.keys(data);
        for (var i = 0; i < keys.length; i++) {
            this[keys[i]] = data[keys[i]];
        }
    };

    CommonQuestions.prototype.Select = function () {
        this.Id = guid();

        Form.CurrentForm().AddCommonQuestion(angular.copy(this));
    };
    CommonQuestions.prototype.Remove = function () {
        common_questions_factory.delete(this.Id).then(function () {
            window.location.reload();
        });
    };

        // Static Methods
    CommonQuestions.Current = function () {
        return $rootScope.config_info;
    };
    CommonQuestions.GetAll = function (callback) {
        common_questions_factory.get().then(function (data) {
            var collection = [];

            for (var i = 0; i < data.length; i++) {
                collection.push(new CommonQuestions(data[i]));
            }

            callback(collection);
        });
    };

    return CommonQuestions;
}]);

测试文件

    describe('CommonQuestions Test', function () {
    beforeEach(module('omnibyte_inspect_web.objects'));

    var common_questions_factory, $rootScope, CommonQuestions, Form;

    beforeEach(inject(function (_common_questions_factory_, _Form_, _$rootScope_, _CommonQuestions_) {
        common_questions_factory = _common_questions_factory_;
        Form = _Form_;
        $rootScope = _$rootScope_;
        CommonQuestions = _CommonQuestions_;

        spyOn(CommonQuestions, 'GetAll');
        spyOn(common_questions_factory, 'get');
        spyOn(CommonQuestions, 'Current');       
    }));

    it('should have CommonQuestions be defined', function () {
        expect(CommonQuestions).toBeDefined();
    });
});

编辑

在多个文件上遇到相同的问题,但它似乎来自我的表单文件。即:

表格

angular.module('omnibyte_inspect_web.objects')
.factory('Form', ['forms_factory', 'authentication_service', 'common_questions_factory', 'formdata_factory', 'missinginformation_factory', '$stateParams', 'Question', 'LocationContact', '$rootScope', '$ionicPopup', '$state',
function (forms_factory, authentication_service, common_questions_factory, formdata_factory, missinginformation_factory, $stateParams, Question, LocationContact, $rootScope, $ionicPopup, $state) {

二次编辑

将此模块beforeEach(module('ui.router')); 放入我的测试文件后,我得到:

错误:[$injector:unpr] 未知提供者:$ionicPopupProvider

将这个模块beforeEach(module('$ionic')); 放入我的测试文件后,错误就消失了;但是,我得到了预期的未定义定义。这个测试在我所有的其他文件中都有效。

【问题讨论】:

  • 请不要添加“已解决”。接受解决问题的答案,这可以是你的
  • 听起来不错,谢谢。

标签: angularjs testing jasmine karma-jasmine code-injection


【解决方案1】:

$stateParams 是 angular-ui/ui-router 中的服务。确保 ui-router 包含在您的 karma.conf.js 文件中。

【讨论】:

  • 这已包含在业力文件中,但我仍然收到错误消息。这是正确的文件吗? 'www/lib/ionic/js/angular-ui/angular-ui-router.js',
  • 添加了一些编辑,希望这会有所帮助。感谢您的帮助。
  • 已解决。感谢您的帮助!
【解决方案2】:

找到了解决方案。我需要将这些模块添加到测试文件中:

beforeEach(module('omnibyte_inspect_web.objects'));
beforeEach(module('ui.router'));
beforeEach(module('ionic'));

在我的 karma.conf.js 文件中,这被注释掉了:

'www/lib/ionic/js/ionic.bundle.js',

进行这些更改后,它已修复。

【讨论】:

  • 干得好!茉莉花注入错误通常会在那里的某个地方找到。调试起来非常困难
  • 谢谢!感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-15
  • 1970-01-01
相关资源
最近更新 更多