简体   繁体   English

单元测试中的 Angular 1.x 服务注入

[英]Angular 1.x service injection in unit tests

I've been trying different variations based on the info that's out there, but haven't got to a working solution yet.我一直在根据现有信息尝试不同的变体,但还没有找到可行的解决方案。

I'm trying to inject a service into a unit test for testing.我正在尝试将服务注入单元测试进行测试。

My current implementation is below.我目前的实现如下。 The issue is, the service isn't: ReferenceError: Can't find variable: SerializationService - I've tried using inject() in the beforeeach too to no avail.问题是,该服务不是: ReferenceError: Can't find variable: SerializationService - 我也试过在 beforeeach 中使用inject()也无济于事。

spec.js规范.js

'use strict';

describe('SerializationService', function () {

  var SerializationService;

  beforeEach(function () {

    module('app');

    inject(function (_SerializationService_) {
      SerializationService = _SerializationService_;
    });
  });

  it('should have a SerializationService', function () {
    expect(SerializationService).toBeDefined();
  });
});

Other things I've tried:我尝试过的其他事情:

  • Using separate module includes between the app module and injecting services in another foreach using the underscore notation使用单独的模块包含在 app 模块之间,并使用下划线表示法在另一个 foreach 中注入服务

karma.conf业力配置文件

// Karma configuration
// http://karma-runner.github.io/0.12/config/configuration-file.html
// Generated on 2016-08-15 using
// generator-karma 0.8.3

module.exports = function (config) {
  'use strict';

  config.set({
    // enable / disable watching file and executing tests whenever any file changes
    autoWatch: true,

    // 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_components/angular/angular.js',
      'bower_components/angular-mocks/angular-mocks.js',
      'bower_components/angular-animate/angular-animate.js',
      'bower_components/angular-cookies/angular-cookies.js',
      'bower_components/angular-resource/angular-resource.js',
      'bower_components/angular-route/angular-route.js',
      'bower_components/angular-sanitize/angular-sanitize.js',
      'bower_components/angular-touch/angular-touch.js',
      'bower_components/json3/lib/json3.js',
      'bower_components/es5-shim/es5-shim.js',
      'bower_components/jquery/dist/jquery.js',
      'bower_components/bootstrap-sass-official/assets/javascripts/bootstrap.js',
      'bower_components/angular-resource/angular-resource.js',
      'bower_components/angular-cookies/angular-cookies.js',
      'bower_components/angular-sanitize/angular-sanitize.js',
      'bower_components/angular-animate/angular-animate.js',
      'bower_components/angular-touch/angular-touch.js',
      'bower_components/angular-route/angular-route.js',
      'bower_components/angular-ui-router/release/angular-ui-router.js',
      'bower_components/angular-audio/app/angular.audio.js',
      'bower_components/socket.io.client/dist/socket.io-1.3.5.js',
      'bower_components/angular-socket-io/socket.js',
      'bower_components/angular-local-storage/dist/angular-local-storage.js',
      'bower_components/moment/moment.js',
      'bower_components/angular-moment/angular-moment.js',
      'bower_components/angular-scroll-glue/src/scrollglue.js',
      'bower_components/angular-gravatar/build/angular-gravatar.js',
      'bower_components/angular-socialshare/dist/angular-socialshare.min.js',
      'bower_components/clipboard/dist/clipboard.js',
      'bower_components/ngclipboard/dist/ngclipboard.js',
      'bower_components/color-thief/src/color-thief.js',
      'bower_components/ngColorThief/angular-colorthief.js',
      'bower_components/hashids/dist/hashids.js',
      'bower_components/ngEmbed/src/ng-embed.js',
      'bower_components/angular-bootstrap/ui-bootstrap-tpls.js',
      'bower_components/ngEmbed/src/ng-embed.js',
      'app/scripts/**/*.js',
      'test/unit/mock/**/*.js',
      'test/unit/spec/**/*.js'
    ],

    // list of files / patterns to exclude
    exclude: [],

    // web server port
    port: 8081,

    // Start these browsers, currently available:
    // - Chrome
    // - ChromeCanary
    // - Firefox
    // - Opera
    // - Safari (only Mac)
    // - PhantomJS
    // - IE (only Windows)
    browsers: [
      'PhantomJS'
    ],

    // Which plugins to enable
    plugins: [
      'karma-phantomjs-launcher',
      'karma-jasmine'
    ],

    // Continuous Integration mode
    // if true, it capture browsers, run tests and exit
    singleRun: false,

    colors: true,

    // level of logging
    // possible values: LOG_DISABLE || LOG_ERROR || LOG_WARN || LOG_INFO || LOG_DEBUG
    logLevel: config.LOG_INFO

    //// Uncomment the following lines if you are using grunt's server to run the tests
    // proxies: {
    //   '/': 'http://localhost:9000/'
    // },
    // //URL root prevent conflicts with the site root
    // urlRoot: '_karma_'
  });
};

I've created a little sample on plunker: Plunker example我在 plunker 上创建了一个小示例: Plunker example

It uses angular-mocks and jasmine for testing.它使用 angular-mocks 和 jasmine 进行测试。 The main part:主要部分:

describe('TestService', function(){
  beforeEach(module('test'));

  var TestService;
  beforeEach(inject(function(_TestService_) {
    TestService = _TestService_;
  }));

  it('returns 42', function(){
    expect(TestService.testMethod()).toEqual(42);
  });
});

You have to use inject , which is defined in angular-mocks.您必须使用在 angular-mocks 中定义的inject It injects services, controllers, etc. The underscores are automatically stripped, it is only syntactic sugar to be able to name your variable as TestService它注入服务、控制器等。下划线会自动去除,能够将变量命名为TestService只是语法糖

Issue was in my mocking modules问题出在我的模拟模块中

I was using the crate method instead of the get:我使用的是 crate 方法而不是 get:

This is wrong:这是错误的:

angular
  .module('meow-mock', [])
  .factory('somemock', function () {
  //code
  });

This is right:这是对的:

angular
  .module('meow-mock')
  .factory('somemock', function () {
  //code
  });

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM