【问题标题】:AngularJs, Karma, Jasmine, Why are services not available under this scenario for test case?AngularJs, Karma, Jasmine, 为什么在这种场景下测试用例没有服务可用?
【发布时间】:2016-01-30 05:39:37
【问题描述】:

我正在使用 grunt 并运行 karma 任务。我的单元测试用例配置了业力/茉莉花。似乎一切都应该到位,但我的一项服务无法加载。

下面的 conststsservice 导致错误

(function() {
  'use strict';
  /**
   * Run a suite of tests.
   */
  describe('Registration Service API tests:', function() { 
    beforeEach(module('registration'));

    var scope = null;
    var constantService = null;

    console.log('Setting up test : ');
    /**
     * Set up variables before each call.
     * @returns
     */
    beforeEach(inject(function($rootScope) {
      scope = $rootScope.$new();              
      console.log('Before test[1]!! : ');
    }));

    beforeEach(inject(function($injector) {
      var serv1 = $injector.get('ConstantsService');
      console.log('Before test[2]!! : ');
    }));


    /**
     * Tear down after each test.
     * @returns
     */
    afterEach(function() {
      console.log('After test!! : ');
    });  

    /**
     * Run the behavior driven test.
     */
    it('Test Constant API properties:', function() {  
      console.log('Running test!! : '+ angular.toJson(scope));      
    });      
  });
})();

错误:

[32mINFO [PhantomJS 1.9.8 (Windows 7)]: [39mConnected on socket M74ZRKv1ww3Od5Y0gbhR with id 86992083
[36mDEBUG [launcher]: [39mPhantomJS (id 86992083) captured in 2.23 secs
[36mDEBUG [web-server]: [39mserving: C:\someuser\projects\workspace\register\WebContent\node_modules\karma\static/context.html
[36mDEBUG [web-server]: [39mserving (cached): C:/someuser/projects/workspace/register/WebContent/node_modules/karma-jasmine/lib/jasmine.js
[36mDEBUG [web-server]: [39mserving (cached): C:/someuser/projects/workspace/register/WebContent/node_modules/karma-jasmine/lib/boot.js
[36mDEBUG [web-server]: [39mserving (cached): C:/someuser/projects/workspace/register/WebContent/node_modules/karma-jasmine/lib/adapter.js
[36mDEBUG [web-server]: [39mserving (cached): C:/someuser/projects/workspace/register/WebContent/app/bower_components/jquery/dist/jquery.js
[36mDEBUG [web-server]: [39mserving (cached): C:/someuser/projects/workspace/register/WebContent/app/bower_components/angular/angular.min.js
[36mDEBUG [web-server]: [39mserving (cached): C:/someuser/projects/workspace/register/WebContent/app/bower_components/angular-mocks/angular-mocks.js
[36mDEBUG [web-server]: [39mserving (cached): C:/someuser/projects/workspace/register/WebContent/app/bower_components/angular-ui-router/release/angular-ui-router.min.js
[36mDEBUG [web-server]: [39mserving (cached): C:/someuser/projects/workspace/register/WebContent/app/bower_components/angular-translate/angular-translate.min.js
[36mDEBUG [web-server]: [39mserving (cached): C:/someuser/projects/workspace/register/WebContent/app/bower_components/angular-animate/angular-animate.min.js
[36mDEBUG [web-server]: [39mserving (cached): C:/someuser/projects/workspace/register/WebContent/app/bower_components/bootstrap/dist/js/bootstrap.js
[36mDEBUG [web-server]: [39mserving (cached): C:/someuser/projects/workspace/register/WebContent/app/bower_components/moment/min/moment.min.js
[36mDEBUG [web-server]: [39mserving (cached): C:/someuser/projects/workspace/register/WebContent/app/js/base64.js
[36mDEBUG [web-server]: [39mserving (cached): C:/someuser/projects/workspace/register/WebContent/app/modules/registration/scripts/registration.js
[36mDEBUG [web-server]: [39mserving (cached): C:/someuser/projects/workspace/register/WebContent/app/scripts/services/applicationConstants.js
[36mDEBUG [web-server]: [39mserving (cached): C:/someuser/projects/workspace/register/WebContent/app/modules/registration/controllers/registrationCtrl.js
[36mDEBUG [web-server]: [39mserving (cached): C:/someuser/projects/workspace/register/WebContent/app/modules/password/scripts/password.js
[36mDEBUG [web-server]: [39mserving (cached): C:/someuser/projects/workspace/register/WebContent/app/modules/password/controllers/passwordCtrl.js
[36mDEBUG [web-server]: [39mserving (cached): C:/someuser/projects/workspace/register/WebContent/app/modules/registration/submodules/verify/scripts/controllers/verifyInformationCtrl.js
[36mDEBUG [web-server]: [39mserving (cached): C:/someuser/projects/workspace/register/WebContent/app/modules/registration/submodules/accountSetup/scripts/controllers/accountPasswordSetupCtrl.js
[36mDEBUG [web-server]: [39mserving (cached): C:/someuser/projects/workspace/register/WebContent/app/scripts/3c74702c.modules.js
[36mDEBUG [web-server]: [39mserving (cached): C:/someuser/projects/workspace/register/WebContent/app/modules/registration/scripts/progressbar.js
[36mDEBUG [web-server]: [39mserving (cached): C:/someuser/projects/workspace/register/WebContent/app/app.js
[36mDEBUG [web-server]: [39mserving (cached): C:/someuser/projects/workspace/register/test/spec/registration/tests/applicationConstantTest.js
[36mDEBUG [web-server]: [39mserving (cached): C:/someuser/projects/workspace/register/test/testHelper.js
PhantomJS 1.9.8 (Windows 7) LOG: [36m'Setting up test : '[39m


[1A[2KPhantomJS 1.9.8 (Windows 7): Executed 0 of 1[32m SUCCESS[39m (0 secs / 0 secs)
[1A[2KLOG: [36m'Before test[1]!! : '[39m
PhantomJS 1.9.8 (Windows 7): Executed 0 of 1[32m SUCCESS[39m (0 secs / 0 secs)
[1A[2KLOG: [36m'Running test!! : "$SCOPE"'[39m
PhantomJS 1.9.8 (Windows 7): Executed 0 of 1[32m SUCCESS[39m (0 secs / 0 secs)
[1A[2KLOG: [36m'After test!! : '[39m
PhantomJS 1.9.8 (Windows 7): Executed 0 of 1[32m SUCCESS[39m (0 secs / 0 secs)
[1A[2K[31mPhantomJS 1.9.8 (Windows 7) Registration Service API tests: Test Constant API properties: FAILED[39m
    Error: [$injector:unpr] http://errors.angularjs.org/1.4.0/$injector/unpr?p0=ConstantsServiceProvider%20%3C-%20ConstantsService
        at C:/someuser/projects/workspace/register/WebContent/app/bower_components/angular/angular.min.js:40
        at d (C:/someuser/projects/workspace/register/WebContent/app/bower_components/angular/angular.min.js:38)
        at C:/someuser/projects/workspace/register/WebContent/app/bower_components/angular/angular.min.js:40
        at d (C:/someuser/projects/workspace/register/WebContent/app/bower_components/angular/angular.min.js:38)
        at C:/someuser/projects/workspace/register/test/spec/registration/tests/applicationConstantTest.js?52375e25073be74d7060ae6c13510c057f544726:26
        at e (C:/someuser/projects/workspace/register/WebContent/app/bower_components/angular/angular.min.js:38)
        at workFn (C:/someuser/projects/workspace/register/WebContent/app/bower_components/angular-mocks/angular-mocks.js:2420)
        at C:/someuser/projects/workspace/register/WebContent/node_modules/karma-jasmine/lib/boot.js:117
        at C:/someuser/projects/workspace/register/WebContent/node_modules/karma-jasmine/lib/adapter.js:171
        at http://localhost:10086/karma.js:189
        at http://localhost:10086/context.html:81
    undefined
PhantomJS 1.9.8 (Windows 7): Executed 1 of 1[31m (1 FAILED)[39m (0 secs / 0.014 secs)
[1A[2KPhantomJS 1.9.8 (Windows 7): Executed 1 of 1[31m (1 FAILED)[39m[31m ERROR[39m (0.002 secs / 0.014 secs)
[36mDEBUG [karma]: [39mRun complete, exitting.
[36mDEBUG [launcher]: [39mDisconnecting all browsers
[36mDEBUG [launcher]: [39mProcess PhantomJS exited with code 0
[36mDEBUG [temp-dir]: [39mCleaning temp dir C:\Users\User\AppData\Local\Temp\karma-86992083
[33mWarning: Task "karma:registration" failed. Use --force to continue.[39m

[31mAborted due to warnings.[39m

在 gruntfile.js 中相关:

 karma: {               
   registration: {
     configFile: 'karma.conf.js',
     singleRun: true
   }
 },

Karma 配置文件:

module.exports = 功能(配置){ 配置.set({ // 启用/禁用监视文件并在任何文件更改时执行测试 自动监视:假,

// base path, that will be used to resolve files and exclude
basePath: '',

// testing framework to use (jasmine/mocha/qunit/...)
frameworks: ['jasmine'],

// list of files / patterns to load in the browser
files: [
        'app/bower_components/jquery/dist/jquery.js',
        'app/bower_components/angular/angular.min.js',
        'app/bower_components/angular-mocks/angular-mocks.js',
        'app/bower_components/angular-ui-router/release/angular-ui-router.min.js',
        'app/bower_components/angular-translate/angular-translate.min.js',
        'app/bower_components/angular-animate/angular-animate.min.js',            
        'app/bower_components/bootstrap/dist/js/bootstrap.js',
        'app/bower_components/moment/min/moment.min.js',
        'app/js/base64.js',

        'app/modules/registration/scripts/registration.js',
        'app/scripts/services/applicationConstants.js',
        'app/modules/registration/controllers/registrationCtrl.js',          

        'app/modules/registration/submodules/verify/scripts/controllers/verifyInformationCtrl.js',
        'app/modules/registration/submodules/accountSetup/scripts/controllers/accountPasswordSetupCtrl.js',

        'app/scripts/*.js',
        'app/scripts/**/*.js',
        'app/modules/**/*.js',
        'app/app.js',                  
        '../test/**/*.js',
        'app/scripts/services/applicationConstants.js',
],

这是服务,我要加载。我无法引用定义的服务。

(function() {
  'use strict';
    angular.module('registration').factory('ConstantsService', ['$q', function ($q) {     
      var appInformation = {                    
          appname : 'app1'        
      };
      /**
       * Return encoded representation of application information.
       */
      var encodeAppInformation = function() {
        var dataResult = "000000";
        var milliseconds = (new Date()).getTime();
        if (!window.btoa) {
        window.btoa = base64.encode(appInformation.appname);
      }     
        dataResult = window.btoa(appInformation.appname+';'+milliseconds) ;
        return dataResult; 
      };
        return {
        APPLICATION_INFORMATION: appInformation,
        encodeAppInformation : encodeAppInformation
      };
    }]);
})();

【问题讨论】:

  • 我加了两次,还是一样的问题
  • 有没有一种方法可以轻松打印模块中的服务,这可能有助于调试。

标签: angularjs jasmine karma-runner


【解决方案1】:

不要在每个块之前注入$injector,而是注入服务本身,如下所示:

beforeEach(inject(function(ConstantsService) {
      var serv1 = ConstantsService;
      console.log('Before test[2]!! : ');
    }));

问题也可能是您过度包含脚本并且您的模块定义被覆盖,特别是在本节中

'app/scripts/*.js',
    'app/scripts/**/*.js',
    'app/modules/**/*.js',
    'app/app.js',                  
    '../test/**/*.js',
    'app/scripts/services/applicationConstants.js',

如果您查看 angularjs 生成的the error url,您可以看到以下模式可以清除注册:

angular.module('myModule', [])
  .service('myCoolService', function () { /* ... */ });

angular.module('myModule', [])
  // myModule has already been created! This is not what you want!
  .directive('myDirective', ['myCoolService', function (myCoolService) {
    // This directive definition throws unknown provider, because myCoolService
    // has been destroyed.
  }]);

这可能与您包含文件的方式有关

【讨论】:

  • ConstantsService 未定义并导致错误。我先试过了。 beforeeach 语句失败。几乎就像由于某种原因没有加载 constantsService 一样。
  • 对于您最近的更新,我有几个文件,我想要一个模块,但要向该模块添加多个服务。那么我该如何纠正你所描述的错误。我认为模块定义会在您定义它们时向模块“添加”指令或服务。
  • 好吧,问题解决了,我不知道为什么。我摆脱了上面包含的“通配符”脚本,只是明确地包含了脚本并解决了问题。诡异的。我希望如果已经包含一个脚本,上面的通配符混乱就不会发挥作用。
猜你喜欢
  • 2018-12-23
  • 2014-05-04
  • 2021-01-23
  • 1970-01-01
  • 2013-12-24
  • 1970-01-01
  • 1970-01-01
  • 2014-09-20
  • 2013-05-15
相关资源
最近更新 更多