Gla*_*mes 12 typescript angular2-routing angular2-testing angular
我需要能够模拟激活的路由参数才能测试我的组件.
到目前为止,这是我最好的尝试,但它不起作用.
{ provide: ActivatedRoute, useValue: { params: [ { 'id': 1 } ] } },
Run Code Online (Sandbox Code Playgroud)
ActivatedRoute在实际组件中使用如下:
this.route.params.subscribe(params => {
this.stateId = +params['id'];
this.stateService.getState(this.stateId).then(state => {
this.state = state;
});
});
Run Code Online (Sandbox Code Playgroud)
我目前尝试的错误很简单:
TypeError: undefined is not a constructor (evaluating 'this.route.params.subscribe')
任何帮助将不胜感激.
jon*_*rpe 36
你的模拟必须反映它正在取代的对象.你.subscribe因为它返回一个observable,而不仅仅是对象,所以你的mock值也应该:
import { Observable } from 'rxjs/Rx';
...
{ provide: ActivatedRoute, useValue: { 'params': Observable.from([{ 'id': 1 }]) } }
Run Code Online (Sandbox Code Playgroud)
@jonrsharpe 给出的答案允许您模拟params,但这些参数在每个测试中都是相同的。
如果您希望能够params在测试开始时更改, 设置它,您可以这样做:
在顶部:
describe('SomeComponent', () => {
(...)
let params: Subject<Params>;
(...)
Run Code Online (Sandbox Code Playgroud)
在beforeEach(async一个 - 你有的地方imports,providers等等):
beforeEach(async(() => {
params = new Subject<Params>();
(...)
Run Code Online (Sandbox Code Playgroud)
在providers:
(...)
{
provide: ActivatedRoute,
useValue: {
params: params
}
}
(...)
Run Code Online (Sandbox Code Playgroud)
然后在测试中:
it('someTest', () => {
params.next({'id': '123'});
fixture.detectChanges();
(...)
Run Code Online (Sandbox Code Playgroud)
重要的提示
请务必在fixture.detectChanges之后致电params.next。
这意味着您应该fixture.detectChanges从beforeEach每个测试中删除它并将其添加到每个测试中。
| 归档时间: |
|
| 查看次数: |
9509 次 |
| 最近记录: |