113

オブジェクトの編集に使用されるコンポーネントの単体テストを行っています。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コンポーネントにはこのパラメーターが必要です。

ところで、私はすでにSessionサービスのモックを持っているので、心配する必要はありません。

4

10 に答える 10

154

これを行う最も簡単な方法は、useValue属性を使用して、モックしたい値の Observable を提供することです。

RxJS < 6

import { Observable } from 'rxjs/Observable';
import 'rxjs/add/observable/of';
...
{
  provide: ActivatedRoute,
  useValue: {
    params: Observable.of({id: 123})
  }
}

RxJS >= 6

import { of } from 'rxjs';
...
{
  provide: ActivatedRoute,
  useValue: {
    params: of({id: 123})
  }
}
于 2016-12-06T14:16:53.153 に答える
19

私はこれを行う方法を考え出しました!

はサービスなのでActivatedRoute、そのための模擬サービスを確立できます。このモックサービスを呼び出しましょうMockActivatedRoute。で次のように拡張ActivatedRouteMockActivatedRouteます。

class MockActivatedRoute extends ActivatedRoute {
    constructor() {
        super(null, null, null, null, null);
        this.params = Observable.of({id: "5"});
    }

この行super(null, ....)は、4 つの必須パラメータを持つスーパー クラスを初期化します。ただし、この例では、これらのパラメーターのいずれも必要ないため、値に初期化しnullます。必要なのは、その値paramsObservable<>. したがって、 を使用してthis.params、 の値をオーバーライドし、被験者が依存しているパラメータの にparamsなるように初期化します。Observable<>

次に、他のモック サービスと同様に、それを初期化し、コンポーネントのプロバイダーをオーバーライドします。

幸運を!

于 2016-07-13T15:59:01.193 に答える
11

angular 2.0最新でテストした方法は次のとおりです...

import { ActivatedRoute, Data } from '@angular/router';

およびプロバイダーセクション

{
  provide: ActivatedRoute,
  useValue: {
    data: {
      subscribe: (fn: (value: Data) => void) => fn({
        yourData: 'yolo'
      })
    }
  }
}
于 2016-11-15T12:36:44.727 に答える