【问题标题】:Inject Service in Karma with Typescript test使用 Typescript 测试在 Karma 中注入服务
【发布时间】:2017-03-26 19:09:23
【问题描述】:

在我的应用程序中进行测试时遇到了同样的问题。我开始使用 TypeScript,我还在学习。

我遇到了这个错误:

Error: [$injector:unpr] Unknown provider: movieProvider <- movie

movie.spec.ts

import { MovieService } from './movie';

describe('service MovieService', () => {
  let movieService: MovieService;

  beforeEach(angular.mock.module('movieSearch'));

  it('should be registered', inject((movie : MovieService) => {
    expect(movie).not.toBeNull();
  }));
});

movie.ts

/** @ngInject */
export class MovieService {
  static $inject = ['$log', '$http', 'LoaderManager'];
  public apiMovieDetail: string = 'http://www.omdbapi.com/';

  /** @ngInject */
  constructor(private $log: angular.ILogService, private $http: angular.IHttpService, private loader: LoaderManager) {
  }

  public getMovie(id: string): angular.IPromise<IMovie> {
    this.loader.add();
    return this.$http.get(this.apiMovieDetail + '?plot=short&r=json&i=' + id).then((response: any): any => {
        this.loader.remove();
        return response.data;
      })
      .catch((error: any): any => {
        this.loader.remove();
        this.$log.error('XHR Failed for getMovie.\n', error.data);
      });
  }

}

我可以使用以下代码注入控制器:

beforeEach(inject(($controller: angular.IControllerService) => {
    mainController = $controller('MainController');
}));

【问题讨论】:

  • 不是模块 beforeEach(angular.mock.module('movieSearch'));应该是 beforeEach(angular.mock.module('movieService')); ?
  • 感谢@Sreekanth 的评论!这不是问题,经过我已经发现的大量测试,请看下面我自己的答案。

标签: angularjs typescript jasmine karma-runner


【解决方案1】:

下面的注入工作正常。直接注入 MovieService。

  beforeEach(inject((MovieService: MovieService, $httpBackend: angular.IHttpBackendService, $log: angular.ILogService) => {
    movieService = MovieService;
    httpBackend = $httpBackend;
    log = $log;
  }));

但是当我使用“它”上的注入进行测试时,如下所示

  it('should be registered', inject((movie : MovieService) => {
    expect(movie).not.toBeNull();
  }));

他无法解决第二个问题MovieService。如果我使用在 1 示例上设置的 movieService 变量有效。如下:

beforeEach(inject((movieService: MovieService) => {
    movieService = $httpBackend;
}));

it('should be registered', inject(() => {
    expect(movieService).not.toBeNull();
}));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-21
    • 2021-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-08
    相关资源
    最近更新 更多