Angular Test

目前在使用 Angular unit test 遇到一些問題,由於有 component 會取用 router 的 queryparams 和 params,請問 Testbed 的 provider 該如何設定以便使用 queryparams 及 params?

在官網裡的做法是,建立一個 stub 的 ActivateRouted,然後再 TestBed 的地方 provide 給他使用,queryparams 的做法也是一樣的

import { ReplaySubject } from 'rxjs/ReplaySubject';
import { convertToParamMap, ParamMap, Params } from '@angular/router';

/**
 * An ActivateRoute test double with a `paramMap` observable.
 * Use the `setParamMap()` method to add the next `paramMap` value.
 */
export class ActivatedRouteStub {
  // Use a ReplaySubject to share previous values with subscribers
  // and pump new values into the `paramMap` observable
  private subject = new ReplaySubject<ParamMap>();

  constructor(initialParams?: Params) {
    this.setParamMap(initialParams);
  }

  /** The mock paramMap observable */
  readonly paramMap = this.subject.asObservable();

  /** Set the paramMap observables's next value */
  setParamMap(params?: Params) {
    this.subject.next(convertToParamMap(params));
  };
}

完整程式碼

1個讚

謝謝大大的解法,
目前遇到另一個問題,
若Testbed 已經使用 compileComponents() ,
之後再使用 overrideProvider 修改 provider 的 useValue ,
provider 不會使用新的 Value 而是繼續使用舊的,

overrideProvider 只能在 compileComponents 前使用 provider value 才會變更嗎?

其實是在 createComponent 之前,理論上即使在之後再次執行 overrideProvider 時且重新建立 component, 這時應該要吃到最後修改的結果,但目前看起來是有問題的

所以你這裡暫時的幾法應該要使用 spyObj 來處理會比較有彈性,spyObj 可以讓你在每一個 test case 內去設定要回傳的值是什麼

1個讚

剛剛小小的測試一下,這是 TestBed Override等方法的使用方式

2個讚