このケースを念頭に置いて設計されていると思ったので、数週間前に 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公開して直接操作するのが最善の選択肢ですか?