5

NG-CLI (beta.15) で新しいプロジェクトを作成し、を変更して をapp.component.specに変更したところ、次のエラーでテストが失敗しました。beforeEachbeforeAll

失敗: テスト モジュールにインポートされていないため、コンポーネント AppComponent を作成できません!

このエラーが何を意味するのか、もちろんそもそもなぜエラーが発生するのかわかりません。

変更された仕様は次のとおりです。

import { TestBed, async } from '@angular/core/testing';
import { AppComponent } from './app.component';

describe('App: Ng2CliTest2', () => {
  beforeAll(() => {
    TestBed.configureTestingModule({
      declarations: [
        AppComponent
      ],
    });
  });

  it('should create the app', async(() => {
    let fixture = TestBed.createComponent(AppComponent);
    let app = fixture.debugElement.componentInstance;
    expect(app).toBeTruthy();
  }));

  it(`should have as title 'app works!'`, async(() => {
    let fixture = TestBed.createComponent(AppComponent);
    let app = fixture.debugElement.componentInstance;
    expect(app.title).toEqual('app works!');
  }));

  it('should render title in a h1 tag', async(() => {
    let fixture = TestBed.createComponent(AppComponent);
    fixture.detectChanges();
    let compiled = fixture.debugElement.nativeElement;
    expect(compiled.querySelector('h1').textContent).toContain('app works!');
  }));
});

次に、仕様をこれに変更すると、最初の 2 つのテストは成功し、3 つ目のテストは失敗して次のメッセージが表示されます。

失敗しました: 破棄されたビューを使用しようとしました: detectChanges

import { TestBed, async } from '@angular/core/testing';
import { AppComponent } from './app.component';

let fixture;
let app;

describe('App: Ng2CliTest2', () => {
  beforeAll(() => {
    TestBed.configureTestingModule({
      declarations: [
        AppComponent
      ],
    });
    fixture = TestBed.createComponent(AppComponent);
    app = fixture.debugElement.componentInstance;        
  });

  it('should create the app', async(() => {
    expect(app).toBeTruthy();
  }));

  it(`should have as title 'app works!'`, async(() => {
    expect(app.title).toEqual('app works!');
  }));

  it('should render title in a h1 tag', async(() => {
    fixture.detectChanges();
    let compiled = fixture.debugElement.nativeElement;
    expect(compiled.querySelector('h1').textContent).toContain('app works!');
  }));
});

なぜ失敗があるのか​​ わかりません。

4

2 に答える 2

7

知らず知らずのうちに、Angular は実際に自身のアンダーカバーでテスト モジュールをリセットしますbeforeEach(を参照testing.ts) 。

var _global = <any>(typeof window === 'undefined' ? global : window);

// Reset the test providers and the fake async zone before each test.
if (_global.beforeEach) {
  _global.beforeEach(() => {
    TestBed.resetTestingModule();
    resetFakeAsyncZone();
  });
}

私はこれを試したことさえありませんが、この機能を試して(安全に)無効にする方法を知りたい場合は、次のことを理解しました。

インポートした構成のどこかに

@angular/core/bundles/core-testing.umd.js

これはkarma-test-shim.jsファイル内で何度も発生します。このファイルには、Angular テストで使用するほぼすべてのテスト ユーティリティが含まれています。これは、 testing モジュールからエクスポートされたすべてのものをまとめたものです。beforeEachこれには、グローバル呼び出しを追加する上記のテスト ファイルが含まれます。

そして、上記の情報から明らかでない場合でもbeforeAll、最初のテストにしか適していない場合、Angular はテスト ベッドをリセットします。したがって、次のテストでは、空のテスト ベッド構成からコンポーネントを作成しようとしています。

于 2016-09-28T15:04:51.283 に答える