オブジェクトの編集に使用されるコンポーネントの単体テストをしています。オブジェクトには、サービスでホストされているオブジェクトの配列から特定のオブジェクトを取得するために使用される一意のid
があります。特定のid
は、ルーティングを介して、特にActivatedRoute
クラスを介して渡されるパラメーターを介して取得されます。
コンストラクタは次のとおりです。
constructor(private _router:Router, private _curRoute:ActivatedRoute, private _session:Session) {
}
ngOnInit() {
this._curRoute.params.subscribe(params => {
this.userId = params['id'];
this.userObj = this._session.allUsers.filter(user => user.id.toString() === this.userId.toString())[0];
このコンポーネントで基本的な単体テストを実行したい。ただし、id
パラメーターとコンポーネントneedsこのパラメーターをどのように注入できるかはわかりません。
ところで、私はすでにSession
サービスのモックを持っているので、心配はありません。
これを行う最も簡単な方法は、useValue
属性を使用して、モックする値のObservableを提供することです。
{
provide: ActivatedRoute,
useValue: {
params: Observable.of({id: 123})
}
}
これを行う方法を見つけました!
ActivatedRoute
はサービスであるため、そのための模擬サービスを確立できます。この模擬サービスをMockActivatedRoute
と呼びましょう。次のように、ActivatedRoute
をMockActivatedRoute
に拡張します。
class MockActivatedRoute extends ActivatedRoute {
constructor() {
super(null, null, null, null, null);
this.params = Observable.of({id: "5"});
}
super(null, ....)
行は、4つの必須パラメーターを持つスーパークラスを初期化します。ただし、このインスタンスでは、これらのパラメーターのいずれも必要ないため、null
値に初期化します。必要なのは、Observable<>
であるparams
の値だけです。したがって、this.params
を使用して、params
の値をオーバーライドし、テストサブジェクトが依存しているパラメーターのObservable<>
になるように初期化します。
次に、他のモックサービスと同様に、初期化してコンポーネントのプロバイダーをオーバーライドします。
幸運を祈ります!
最新のangular 2.0でテストした方法は次のとおりです...
import { ActivatedRoute, Data } from '@angular/router';
およびプロバイダセクション
{
provide: ActivatedRoute,
useValue: {
data: {
subscribe: (fn: (value: Data) => void) => fn({
yourData: 'yolo'
})
}
}
}
ActivatedRouteのモックを追加するだけです:
providers: [
{ provide: ActivatedRoute, useClass: MockActivatedRoute }
]
...
class MockActivatedRoute {
// here you can add your mock objects, like snapshot or parent or whatever
// example:
parent = {
snapshot: {data: {title: 'myTitle ' } },
routeConfig: { children: { filter: () => {} } }
};
}
Angular> 5で作業している一部の人々にとっては、if Observable.of();動作していない場合、 'rxjs'からimport {of}をインポートすることで、ちょうどof()を使用できます;