【问题标题】:AngularJS unit testing Karma - unknown providerAngularJS 单元测试业力 - 未知的提供者
【发布时间】:2019-04-23 00:48:09
【问题描述】:

我正在尝试在我们的旧版 AngularJS 应用程序上设置单元测试。我正在使用标准业力和 angular-mock 来设置测试用例。但是当我尝试注入一些服务和工厂时,我遇到了Unknown provider 的问题。我的 karma.conf 看起来像这样(为简洁起见,我删除了很多东西)

module.exports = function(config) {   config.set({

     basePath: '',

     // frameworks to use
     // available frameworks: https://npmjs.org/browse/keyword/karma-adapter
     frameworks: ['jasmine'],

     // list of files / patterns to load in the browser
     files: [
       './node_modules/angular/angular.js',
       "http://cf._____.com/content/myfootprints/js/priorityqueue.js",
       "http://cf._____.com/content/myfootprints/js/ng-flow-standalone.js",
       INCLUDED ALL THE DEPENDENCIES HERE 
       './node_modules/angular-mocks/angular-mocks.js',
       './static/js/app/main.js',
       './static/tests/**/*.js'
     ]
     preprocessors: {
       './static/js/app/**/main.js':['webpack', 'sourcemap'],
       './static/js/app/**/*.js':['webpack', 'sourcemap'],
     },

在我们的应用程序中,我们有一个 main.js,它使用 importsrequireDir 将所有控制器和工厂导入应用程序。它看起来像这样

const requireDir = require('webpack-requiredir');

    import './isocurrency.js';
    import './myfp_uirouter.js';
    import './infobubble.js';
    // other imports
    requireDir(require.context('./controllers', true, /.*\.js$/))
    requireDir(require.context('./directives', true, /.*\.js$/))
    requireDir(require.context('./factories', true, /.*\.js$/))
    requireDir(require.context('./filters', true, /.*\.js$/))

我有一个包含单元测试的文件,看起来像这样

describe('Unit test file, function(){
  var generalUtilFactory;
  beforeEach(inject(function($injector){
    generalUtilFactory = $injector.get('generalUtilsFactory'); <--- getting unknown provider 
    // Also tried to inject it in 
    //via function($rootScope,... _generalUtilFactory_)
  }));

Other code
  .
  .
  .
  .

});

现在我确实有通过 main.js 导入并在 app 模块中注册的通用 util 工厂。我检查在调试器中看到它。看起来是这样的

angular.module('app').factory('generalUtilsFactory', ['$timeout', '$filter', 'FileSaver', 'Blob', function($timeout, $filter, FileSaver, Blob) {
    var generalUtilsFactory = {};

    generalUtilsFactory.getKeys = function(o){

我不太确定这里发生了什么。所有需要的文件都已包含在内,并且所有 es6 都已正确转换。一些帮助将不胜感激

【问题讨论】:

    标签: javascript angularjs unit-testing karma-jasmine


    【解决方案1】:

    我认为您需要在注入服务之前注入主模块。也许这样做会有所帮助:

    describe('Service Tests', function () {
        beforeEach(module('app'));
        var _generalUtilsFactory;
    
        beforeEach(inject(function (generalUtilsFactory) {
            _generalUtilsFactory = generalUtilsFactory
        }));
    });
    

    【讨论】:

    • 那没有解决它。 module(app) 只会创建一个模拟模块,对吗?
    • 是的,我们要确保在注入工厂之前加载主模块。我唯一能想到的就是 $injector 的使用。我们可以在没有 $injector 的情况下尝试一下,只需注入(函数(generalUtilsFactory)吗?
    猜你喜欢
    • 2014-12-06
    • 1970-01-01
    • 2016-06-19
    • 1970-01-01
    • 2017-02-02
    • 2015-03-04
    • 1970-01-01
    • 1970-01-01
    • 2015-04-03
    相关资源
    最近更新 更多