在Angular2中模拟ActivatedRoute对象

时间:2017-02-03 09:19:54

标签: unit-testing angular

我使用激活路线收听路线数据变化:

  SELECT B.COL1, COUNT(DISTINCT B.COL2) AS CNT FROM TABLE2 B
GROUP BY B.COL1 HAVING COUNT(DISTINCT B.COL2) >1

在我的单元测试中,我想模拟这部分this.activatedRoute.params.subscribe(params => { this.model.load(params['id']); }); 来提供测试数据:

this.activatedRoute.params.subscribe

但是我收到了错误:

  

键入'间谍'不能分配给' Observable'。属性   ' _isScalar'类型' Spy'

中缺少

这个错误是什么意思?我为其他观察者使用类似的arrroach并且工作得很好,但只有这个地方。

3 个答案:

答案 0 :(得分:3)

你试图窥探params.subscribe()方法而不是params属性呢?

有些事情:

// This code might need some adjustments...
class MockActivatedRoute {
  params = {
    subscribe: jasmine.createSpy('subscribe')
     .and
     .returnValue(Observable.of(<Params>{id: 1}))
  }
}

答案 1 :(得分:2)

希望这可以帮助像我这样的人。除了AngularChef's answer,我还有一个像这样的链:

// component.ts
this.route.paramMap
    .flatMap((paramMap: Params) => {
        return paramMap.params['userId'];
    })
    .flatMap((userId: string) => {
        ...
    }
    .subscribe(whatever)...

我无法从模块声明中模拟它,因为我需要测试组件对来自userId的不同paramMap的响应。

因此,仅监视flatMap的{​​{1}}通话就为我节省了很多时间。

route.paramMap

答案 2 :(得分:0)

在Angular 4中进行了测试

import { ActivatedRoute }                   from '@angular/router';
import { Observable }                       from 'rxjs/Rx';

...

class MockActivatedRoute extends ActivatedRoute {
  public params = Observable.of({id: 123});
}

...

describe('MyTest', () => {
  ...

  beforeEach(async(() => {
    TestBed.configureTestingModule({
      ...

      providers: [ { provide: ActivatedRoute, useValue: new MockActivatedRoute() } ]
    })
    .compileComponents();
  }));
});