如何模拟route.snapshot.params?

时间:2017-10-19 13:55:23

标签: angular

在我的Angular 4组件中,我有类似的东西:

    s="52.01317215 1121.53601074 1049.63146973 1540.70495605 517.47277832 
     85.62935638 553.46118164 106.97449493 1.70361996 550.58435059 
     159.12145996 714.25854492"
    for s1 in s.split(" "):
        print(s1.split(".")[0])

我正在尝试创建一个假设如下的模拟:

constructor(private route: ActivatedRoute) {
}

ngOnInit() {
  this.myId = this.route.snapshot.params['myId'];
}

我的测试失败了:

  

TypeError:无法读取未定义的属性'params'。

我怎么想嘲笑它?我是否误解了class MockActivatedRoute extends ActivatedRoute { public params = Observable.of({ myId: 123 }); } 的正确用法,应该更好地在我的组件中使用ActivatedRoute?我看到一些复杂的例子,人们嘲笑快照本身,但对我来说它看起来过于复杂。

测试本身很简单:

router.subscribe

如果我只是将测试下的方法更改为以下内容 - 测试有效:

describe('ngOnInit', () => {
it('should set up initial state properly',
  () => {
  const component = TestBed.createComponent(MyComponent).componentInstance;
    component.ngOnInit();
    expect(component.myId).toEqual('123');
  });
});

显然我需要模拟Activated快照,但是有更好的方法吗?

3 个答案:

答案 0 :(得分:16)

好的,我已经找到了如何以简单的方式模拟ActivatedRoute快照。这样的事情对我有用:

providers: [MyComponent, {
  provide: ActivatedRoute,
  useValue: {snapshot: {params: {'myId': '123'}}}
}

谢谢:)

答案 1 :(得分:9)

如果使用route.snapshot.paramMap.get('uuid')代替:

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

{
    provide: ActivatedRoute, useValue:
        { snapshot: { paramMap: convertToParamMap( { 'uuid': '99-88-77' } ) } }
}

答案 2 :(得分:0)

您的代码中存在一个基本的语法错误

代替

this.myId = this.route.snapshot.params['myId'];


使用

更新代码

this.myId = this.route.snapshot.paramMap.get('myId');


您现在可以成功模拟参数。
我假设您已声明字段属性 myId