0

このケースを念頭に置いて設計されていると思ったので、数週間前に ng-mocks を使い始めましたが、私の人生では、それを実装する方法がわかりません。

つまり、MockBuilder/MockRender が定義された後、ネストされた記述/テストでモック プロバイダーの値を変更できますか?

私のアプリケーションには、コンテキストに応じて異なるデータを提供するサービスに依存するコンポーネントがよくあります。これが静的である場合、これはテストするのに十分簡単です。ここでは、ActivatedRoute を例として使用します。

const mockActivatedRoute = { snapshot: { params: { id: 1 } };

describe('MyComponent', () => {
  MockInstance.scope('all');

  beforeEach(() => {
    return MockBuilder(MyComponent, MyModule)
      .provide({ provide: ActivatedRoute, useValue: mockActivatedRoute })
  });

  beforeEach(() => {
    fixture = MockRender(MyComponent);
    component = fixture.point.componentInstance;
  });

  // Imagine the component has a routeId provided by the ActivatedRoute
  it('should have an id of 1', () => { expect(component.routeId).toEqual(1); });
});

ここまでは順調ですね。

しかし、そのテストの後、サービスを変更する別のスイートを実行したいと考えています。が 2 になるとします。私idは、これが の役割であると想定しましMockInstanceた。特定のテストのために、提供されるサービスなどをその場で変更できるようにすることです。

例を続けるためdescribeに、最初のテストの後にネストされた を追加します。

describe('MyComponent', () => {
  ...

  describe('when it inits with a different id', () => {
    MockInstance.scope();

    beforeEach(MockInstance(mockActivatedRoute, () => {
      snapshot: { params: { id: 2 } }
    }));

    it('should have an id of 2', () => { expect(component.routeId).toEqual(2); });
  });
});

新しいモック値が実装されてrouteIdおらず、変更されていないため、このテストは失敗します。

これは悪い例だと思います。私はこれらのテストを非常に多くの異なる方法で書き直しましMockInstance.rememberたが、サービス インスタンス自体を使用または初期化しようとしましたが、成功していません。私が知る限り、MockBuilder と MockInstance は一緒に使用することを意図していないようであり、ng-mocks サイトにはそのような例はありません。このような場合のテストをビルドする唯一の方法はdescribes、独自の MockBuilder と MockRender を使用して個別にビルドすることです。

それとも、routeId公開して直接操作するのが最善の選択肢ですか?

4

0 に答える 0