web-dev-qa-db-ja.com

NgZone依存関係のあるコンポーネントに対してジャスミンテストを実行する

次のコンポーネントのジャスミンテストを実行するにはどうすればよいですか。

@Component({
  moduleId: module.id,
  selector: "testComp",
  template: "<div>{{value}}</div>",
})
export class TestComp {
  public value: string = "This is me";
  constructor(public zone: NgZone) {
    this.zone.run(() => console.log("zone is here"));
  }
}

以下は、NgZoneのすべてのパラメーターを解決できないで失敗します。

describe("test", () => {
    let fixture;
    let component;

beforeEach(async(() => {
    TestBed.configureTestingModule({
        declarations: [TestComp],
        schemas: [NO_ERRORS_SCHEMA],
        providers: [NgZone]
    }).compileComponents;
}));
beforeEach(() => {
    fixture = TestBed.createComponent(TestComp);
    component = fixture.debugElement.componentInstance;
});
it("should check that the component is created", () => {
    expect(component).toBeTruthy();
});

})

using Angular4.1.3。MockNgZoneクラスを@ https://no-shadow-angular-io.firebaseapp.com/docs/ts/latest/api/core /testing/MockNgZone-class.html 。しかし、この特定のバージョンの@ angular/core/testsでは利用できないようです: enter image description here

このコンポーネントをテストするために私が何をすべきか知っている人はいますか?

よろしく

5
Andrey

問題がrunOutsideAngularに関するものである場合、asyncまたはfakeAsyncを使用できないため、モックする必要があるのはその関数だけであり、以下が適切に機能します。

const ngZone = TestBed.get(NgZone);

spyOn(ngZone, 'runOutsideAngular').and.callFake((fn: Function) => fn());
8
maxime1992

少し謎です。 MockNgZone はまだソースにありますが、パブリックAPIから削除されています。

モックrun()の単純な実装を考えると

export class MockNgZone extends NgZone {
  ...
  run(fn: Function): any { return fn(); }

私はこれを使ってあなたをこぶを乗り越えます

const mockNgZone = jasmine.createSpyObj('mockNgZone', ['run', 'runOutsideAngular']);
mockNgZone.run.and.callFake(fn => fn());

TestBed.configureTestingModule({
  ...
  providers: [
    { provide: NgZone, useValue: mockNgZone },
  ]
6
Richard Matsen

Angular 5.2.4(Angular CLI 1.6.8経由でインストール))では、モックがコードベースから削除されたため、Jasmineで使用する必要はありません。プロバイダーリストでのNgZoneの宣言をスキップします。

4

まったく同じ問題がありました。最後に、ngZoneをそのままにして、使用するコールバックをテストするようにします。

beforeEach(async(() => {
TestBed.configureTestingModule({
    ...
    providers: [NgZone]
  })
}));

そして、次のようなngZoneを使用したコードの場合

zone.run(someFunction)

単体テストでsomeFunctionのテストカバレッジが良好であることを確認しました。

0
Guy Yogev