目前在使用 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個讚