1. ホーム
  2. angular

[解決済み] Angular 2のテスト - 非同期関数呼び出し - いつ使うか?

2023-02-20 13:54:39

質問

のasync関数はいつ使うのですか? テストベッド を使用する場合、Angular 2でテストするときですか?

どのような場合に使用するのですか?

 beforeEach(() => {
        TestBed.configureTestingModule({
            declarations: [MyModule],
            schemas: [NO_ERRORS_SCHEMA],
        });
    });

で、これはいつ使うの?

beforeEach(async(() => {
    TestBed.configureTestingModule({
        declarations: [MyModule],
        schemas: [NO_ERRORS_SCHEMA],
    });
}));

どなたかこの件について教えていただけませんか?

どのように解決するのですか?

async を指定しないと、次のテストが開始されません。 async がそのタスクをすべて終了させるまで、 次のテストを開始させません。何 async はコールバックをゾーンでラップし、そこで全ての非同期タスク (例えば setTimeout のような)すべての非同期タスクが追跡されます。すべての非同期タスクが完了したら、次に async が完了します。

Angular以外でJasmineを使用したことがある方は、Jasmineを使用する際に done がコールバックに渡されるのを見たことがあるかもしれません。

it('..', function(done) {
  someAsyncAction().then(() => {
    expect(something).toBe(something);
    done();
  });
});

これはネイティブのJasmineで、Jasmineに、このテストは done() . もし私たちが done() を呼び出さず、代わりにこうします。

it('..', function() {
  someAsyncAction().then(() => {
    expect(something).toBe(something);
  });
});

テストは期待値よりも前に完了します。なぜなら、プロミスは の後に を解決するからです。

Angularでは(Jasmine環境では)、Angularは実際に done を使用するとき、裏側で async . これは Zone 内のすべての非同期タスクと、それらがすべて終了したときの記録を取ります。 done は舞台裏で呼び出されます。

あなたの特定のケースで TestBed の構成では、一般に、次のような場合に使用します。 compileComponents . それ以外に呼び出さなければならないような状況に遭遇することはほとんどありません。

beforeEach(async(() => {
   TestBed.configureTestingModule({
     declarations: [MyModule],
     schemas: [NO_ERRORS_SCHEMA],
   })
   .compileComponent().then(() => {
      fixture = TestBed.createComponent(TestComponent);
   });
}));

を使用するコンポーネントをテストする場合 templateUrl (を使用するコンポーネントをテストする場合(webpackを使用していない場合)、Angularはテンプレートを取得するためにXHRリクエストを行う必要があり、コンポーネントのコンパイルは非同期となります。そのため、テストを続ける前に解決されるまで待つ必要があります。