1

我想設置角度控制器上使用茉莉花和業力的測試。我不能把我所有的代碼在這裏,因爲它是相當大的,但這裏是我的代碼一些樣品:角度服務的茉莉花間諜

CompilerController.js(這就是我要測試的控制器)

(function() { 
    angular.module('webcompiler') 
     .controller('CompilerController', ['templateService', 'compilationService', CompilerController]); 

    function CompilerController(templateService, compilationService) { 
     var vm = this; 

     /// Initialization 
     (function() { 
      vm.template = 'c_basic.c'; 
      ... 
     })(); 

     /// Public members 
     vm.loadTemplate = loadTemplate; 

     /// Implementation 
     function loadTemplate() { 
      templateService.get(vm.template, function(source) { 
       vm.sourcecode = source; 
      }); 
     } 
    } 
})(); 

CompilerController。 spec.js

describe('CompilerController', function() { 
    var CompilationService, TemplateService, controller; 

    beforeEach(function() { 
     module('webcompiler'); 
    }); 

    beforeEach(function() { 
     inject(function(_$controller_, _TemplateService_, _CompilationService_) { 
     CompilationService = _CompilationService_; 
     TemplateService = _TemplateService_; 
     spyOn(TemplateService, 'get').and.callFake(function(code, callback) { 
      callback('c_basic_content'); 
     }); 
     controller = _$controller_('CompilerController'); 
     }); 
    }); 

    it('starts with default template as source', function() { 
     expect(controller.template).toBe('c_basic.c'); 
     expect(controller.sourcecode).toBe('c_basic_content'); 
    }); 

    describe('loadTemplate function', function() { 
     it('changes the content of the source area when called', function() { 

     spyOn(TemplateService, 'get').and.callFake(function(code, callback) { // Does this work ? Changing the spy after injection ? 
      if(code == 'c_parameters.c') { callback('c_parameters_content'); } 
     }); 
     controller.template = 'c_parameters.c'; 
     controller.loadTemplate(); 
     expect(controller.sourcecode).toBe('c_parameters_content'); 
     }); 
    }); 
    }); 

儘管事實上我什至不知道這工作(更換控制器創建後間諜,看我的註釋行),都在這個文件中的測試失敗,出現以下錯誤:

PhantomJS 1.9.8 (Windows 7 0.0.0) CompilerController loadTemplate function changes the content of the source area when called FAILED Error: [$injector:unpr] Unknown provider: TemplateServiceProvider <- TemplateService

這裏是我的一塊karma.conf.js的:

module.exports = function (config) { 
    config.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: [ 
      // bower:js 
      'main/webapp/bower_components/jquery/dist/jquery.js', 
      'main/webapp/bower_components/angular/angular.js', 
      'main/webapp/bower_components/angular-cache-buster/angular-cache-buster.js', 
      'main/webapp/bower_components/bootstrap/dist/js/bootstrap.js', 
      'main/webapp/bower_components/angular-mocks/angular-mocks.js', 
      // endbower 
      'main/webapp/js/webcompiler.module.js', 
      'main/webapp/js/TemplateService.js', 
      'main/webapp/js/CompilationService.js', 
      'main/webapp/js/CompilerController.js', 
      'test/javascript/**/*.coffee' // I use coffeescript for the specs. The file I showed in this question are the compiled version. 
     ], 
     // Browser on which to test 
     browsers: ['PhantomJS'], 
     // Compile coffeescript specs 
     preprocessors: { 
      'test/javascript/**/*.coffee': ['coffee'] 
     }, 
     coffeePreprocessor: { 
      options: { 
      bare: true, 
      sourceMap: false 
      }, 
      transformPath: function(path) { 
      return path.replace(/\.coffee/, '.js') 
      } 
     } 
    }); 
}; 

回答

2

控制器內部使用的是小寫注射服務「templateService」,但它是在beforeEach函數內部大寫注入。可能會有所幫助。

+0

大聲笑,謝謝,就是這樣。我無法相信自己嘗試了10種備用解決方案,但實際上我擁有了正確的解決方案,但由於這樣一個愚蠢的錯誤而無法對其進行測試...... – Kaidjin