【问题标题】:Unknown provider for service during unit test单元测试期间服务的未知提供者
【发布时间】:2017-12-21 01:24:48
【问题描述】:

执行过程中出错..

Error: [$injector:unpr] Unknown provider: secondServiceProvider <- secondService

my.component.controller.ts

import { FirstService } from '../../first.service';
import { SecondService } from '../../second.service';

export class MyComponentController {
  constructor(
    public $state: ng.ui.IStateService,
    private firstService: FirstService,
    private secondService: SecondService) { }
}

MyComponentController.$inject = [
  '$state', 
  FirstService.registeredName, 
  SecondService.registeredName];

my.component.spec.ts

import { FirstService } from '../../first.service';
import { SecondService } from '../../second.service';
import { MyModule } from '../index';

describe('Component: my', () => {

  let $componentController: angular.IComponentControllerService;
  let firstService: FirstService;
  let secondService: SecondService;
  let scope: angular.IScope;
  let $state: ng.ui.IStateService;

  beforeEach(() => {
    angular.mock.module('ui.router');
    angular.mock.module(MyModule.name);
  });

  beforeEach(inject(
    ($rootScope: angular.IScope,
      _$state_: ng.ui.IStateService,
      _$componentController_: angular.IComponentControllerService) => {
      scope = $rootScope.$new();
      $state = _$state_;
      firstService = new FirstService();
      secondService = new SecondService();
      $componentController = _$componentController_;
    }));

  describe('Controller: MyComponentController', () => {
    it('should create an instance of MyComponentController', () => {
      let ctrl: any = $componentController('my', { $scope: scope }, { $state: $state, firstService: firstService, secondService: secondService });
      expect(ctrl).toBeDefined();
    });
  });
});

【问题讨论】:

    标签: angularjs unit-testing typescript


    【解决方案1】:

    $componentController 使用不正确。第三个参数是绑定。模拟服务是依赖项,$scope 也是如此。应该是:

    $componentController('my', {
      $scope: scope, $state: $state, firstService: firstService, secondService: secondService
    });
    

    以这种方式提供真正的依赖项绝对没有意义,默认情况下会提供它们。根据经验,除了测试单元(控制器)之外的所有单元都应该被模拟或存根。

    不应该在单元测试中使用真正的路由器。 ui.router 应被排除在外,如有必要,应模拟或存根其服务。

    【讨论】:

      猜你喜欢
      • 2017-02-02
      • 2015-03-04
      • 2018-10-05
      • 2014-12-06
      • 1970-01-01
      • 2015-04-03
      • 1970-01-01
      • 1970-01-01
      • 2023-01-19
      相关资源
      最近更新 更多