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