我使用激活路线收听路线数据变化:
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并且工作得很好,但只有这个地方。
答案 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();
}));
});