52

サービス A をテストしていますが、サービス A はサービス B に依存しています (つまり、サービス B はサービス A に注入されます)。

この質問を見たことがありますが、私の意見では、サービス B の実際のインスタンスを注入するのではなく、サービス Bをモックする方が理にかなっているため、私の場合は少し異なります。ジャスミンスパイでモックします。

サンプルテストは次のとおりです。

describe("Sample Test Suite", function() {

  beforeEach(function() {

    module('moduleThatContainsServiceA');

    inject([
      'serviceA', function(service) {
        this.service = service;
      }
    ]);

  });

  it('can create an instance of the service', function() {
    expect(this.service).toBeDefined();
  });
});

私が得るエラーは次のとおりです。

エラー: 不明なプロバイダー: serviceBProvider

どうすればこのようなことができますか?

4

5 に答える 5

46

実際、AngularJS 依存性注入では、「最終勝利」ルールが使用されます。したがって、モジュールと依存関係を含めた直後にテストでサービスを定義できます。次に、テストしているサービス A が DI を使用してサービス B を要求すると、AngularJS はサービス B のモック バージョンを提供します。

これは、多くの場合、MyAppMocks のような新しいモジュールを定義し、そこにモックされたサービス/値を配置してから、このモジュールを依存関係として追加することによって行われます。

種類 (概略):

beforeEach(function() {
  angular.module('MyAppMocks',[]).service('B', ...));
  angular.module('Test',['MyApp','MyAppMocks']);
  ...
于 2013-01-09T16:33:42.200 に答える
1

これが私のために働いたものです。重要なのは、モックする実際のモジュールを定義することです。angular.mock.module を呼び出すと、実際のモジュールがモック可能になり、接続できるようになります。

    beforeEach( ->
        @weather_service_url = '/weather_service_url'
        @weather_provider_url = '/weather_provider_url'
        @weather_provider_image = "test.jpeg"
        @http_ret = 'http_works'
        module = angular.module('mockModule',[])
        module.value('weather_service_url', @weather_service_url)
        module.value('weather_provider_url', @weather_provider_url)
        module.value('weather_provider_image', @weather_provider_image)
        module.service('weather_bug_service', services.WeatherBugService)

        angular.mock.module('mockModule')

        inject( ($httpBackend,weather_bug_service) =>
            @$httpBackend = $httpBackend
            @$httpBackend.when('GET', @weather_service_url).respond(@http_ret)
            @subject = weather_bug_service
        )
    )
于 2013-08-12T13:57:49.477 に答える