我需要能够模拟激活的路由参数才能测试我的组件。
这是我迄今为止最好的尝试,但它不起作用。
{ provide: ActivatedRoute, useValue: { params: [ { 'id': 1 } ] } },
ActivatedRoute 在实际组件中的使用如下:
this.route.params.subscribe(params => {
this.stateId = +params['id'];
this.stateService.getState(this.stateId).then(state => {
this.state = state;
});
});
我当前尝试得到的错误很简单:
TypeError: undefined is not a constructor (evaluating 'this.route.params.subscribe')
任何帮助将不胜感激。
您的模拟必须反映它要替换的对象。你
.subscribe
因为它返回一个可观察的,而不仅仅是对象,所以你的模拟值也应该:
import { Observable } from 'rxjs/Rx';
...
{ provide: ActivatedRoute, useValue: { 'params': Observable.from([{ 'id': 1 }]) } }
@jonrsharpe 给出的答案允许您模拟
params
,但这些参数在每个测试中都是相同的。
如果您希望能够更改
params
,在测试开始时设置它,您可以这样做:
顶部:
describe('SomeComponent', () => {
(...)
let params: Subject<Params>;
(...)
在
beforeEach
(async
中 - 你有 imports
、providers
等):
beforeEach(async(() => {
params = new Subject<Params>();
(...)
在
providers
:
(...)
{
provide: ActivatedRoute,
useValue: {
params: params
}
}
(...)
然后在测试中:
it('someTest', () => {
params.next({'id': '123'});
fixture.detectChanges();
(...)
重要提示
请务必在
fixture.detectChanges
之后致电params.next
。
这意味着您应该从
fixture.detectChanges
中删除 beforeEach
并将其添加到每个测试中。
上述解决方案对我有用