26

環境

ApiService独自のシリアライザーとその他の機能を使用しながら、カスタム API クエリを処理できるクラスを作成しました。

ApiServiceのコンストラクターの署名は次のとおりです。

constructor(metaManager: MetaManager, connector: ApiConnectorService, eventDispatcher: EventDispatcher);
  • MetaManagerAPI のメタデータを処理する注入可能なサービスです。
  • ApiConnectorServiceHttpカスタムヘッダーと署名システムを追加するためのラッピングサービスです。
  • EventDispatcherは基本的に Symfony のイベント ディスパッチャー システムであり、typescript で記述されています。

問題

をテストするときApiServiceは、 で初期化を行いますbeforeEach

beforeEach(async(() => {
    TestBed.configureTestingModule({
        imports  : [
            HttpModule
        ],
        providers: [
            ApiConnectorService,
            ApiService,
            MetaManager,
            EventDispatcher,
            OFF_LOGGER_PROVIDERS
        ]
    });
}));

そしてそれはうまくいきます。

次に、 用の 2 番目のスペック ファイルを次のように追加ApiConnectorServicebeforeEachます。

beforeEach(async(() => {
    TestBed.configureTestingModule({
        imports  : [HttpModule],
        providers: [
            ApiConnectorService,
            OFF_LOGGER_PROVIDERS,
            AuthenticationManager,
            EventDispatcher
        ]
    });
}));

そして、すべてのテストが次のエラーで失敗します。

エラー: ApiService のすべてのパラメーターを解決できません: (MetaManager、?、EventDispatcher)。

  • api-connector-service.spec.tsロードしたテストから(ApiConnectorServiceの仕様ファイル)を削除すると、ApiServiceのテストは成功します。
  • api-service.spec.tsロードしたテストから(ApiServiceの仕様ファイル)を削除すると、ApiConnectorServiceのテストは成功します。

なぜこのエラーが発生するのですか? 私の 2 つのファイル間のコンテキストが競合しているように見えますが、これを修正する理由と方法がわかりません。

4

6 に答える 6

1

[JEST と角度]

また、外部モジュールを使用し、それをインポートせずにサービスで使用すると、問題が発生する可能性があります。

元:

import { TestBed } from '@angular/core/testing';
import <ALL needed> from '@ngx-translate/core';

import { SettingsService } from '../../../app/core/services/settings/settings.service';


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

  beforeAll(() => {
    TestBed.configureTestingModule({
      providers: [
        SettingsService,
        // <All needed>
      ]
    });
    service = TestBed.inject<SettingsService>(SettingsService);
  });

  it('should be created', () => {
    expect(service).toBeTruthy();
  });

});

エラーはどこにも行きません...しかし、次のようにすると:

import { TestBed } from '@angular/core/testing';

import { TranslateModule } from '@ngx-translate/core';

import { SettingsService } from '../../../app/core/services/settings/settings.service';


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

  beforeAll(() => {
    TestBed.configureTestingModule({
      imports: [TranslateModule.forRoot()], // <---
      providers: [
        SettingsService
      ]
    });
    service = TestBed.inject<SettingsService>(SettingsService);
  });

  it('should be created', () => {
    expect(service).toBeTruthy();
  });

});

問題が消える。

于 2020-10-28T13:37:12.977 に答える
1

[JEST と角度]

私の場合、根本的な原因は循環依存関係ですが、「インデックスからサービスをインポートする」状況ではありません。そしてng build <project> --prod、「循環依存」が見つかりませんでした。

解決:

サービス/コンポーネントでは、代わりに注入Injectorinjector.get(Service)ます。

于 2021-05-28T09:26:18.363 に答える