私のAngular 4コンポーネントには、次のようなものがあります。
constructor(private route: ActivatedRoute) {
}
ngOnInit() {
this.myId = this.route.snapshot.params['myId'];
}
そして、私は次のように見えると思われるモックを作成しようとしています:
class MockActivatedRoute extends ActivatedRoute {
public params = Observable.of({ myId: 123 });
}
私のテストは失敗します:
TypeError:未定義のプロパティ「params」を読み取ることができません。
どうやってそれをモックすると思いますか? ActivatedRoute
の適切な使用法を誤解したことがありますが、router.subscribe
私のコンポーネントに?スナップショット自体をitself笑した複雑な例をいくつか見ましたが、私にとっては複雑すぎるようです。
テスト自体は非常に簡単です。
describe('ngOnInit', () => {
it('should set up initial state properly',
() => {
const component = TestBed.createComponent(MyComponent).componentInstance;
component.ngOnInit();
expect(component.myId).toEqual('123');
});
});
テスト対象のメソッドを次のように変更するだけで、テストは機能します。
ngOnInit() {
//this.myId = this.route.snapshot.params['myId'];
this.route.params.subscribe(params => {
this.myId = params['myId'];
});
}
明らかに、アクティブ化されたスナップショットをモックする必要がありますが、より良いアプローチはありますか?
OK、ActivatedRouteスナップショットを簡単な方法でモックする方法を見つけました。このような何かが私のために働く:
providers: [MyComponent, {
provide: ActivatedRoute,
useValue: {snapshot: {params: {'myId': '123'}}}
}
ありがとう:)
代わりにroute.snapshot.paramMap.get( 'uuid')を使用する場合:
import { ActivatedRoute, convertToParamMap } from '@angular/router';
{
provide: ActivatedRoute, useValue:
{ snapshot: { paramMap: convertToParamMap( { 'uuid': '99-88-77' } ) } }
}
コードに基本的な構文エラーがあります
の代わりに
_this.myId = this.route.snapshot.params['myId'];
_
でコードを更新します
this.myId = this.route.snapshot.paramMap.get('myId');
これで、paramを正常にモックできるようになります。
フィールドプロパティを宣言していると仮定しています 私のID。