Angular 单元测试模拟 paramMap 获取

Ser*_*gey 4 unit-testing karma-runner angular

我有一个组件,它代表列表中的一个项目,并使用我来获取这个项目this.route.snapshot.paramMap.get('id')。我如何嘲笑这个?我试过了

providers: [
                {
                    provide: ActivatedRoute,
                    useValue: { snapshot: { params: convertToParamMap({ id: '1' }) } }
                }
            ]
Run Code Online (Sandbox Code Playgroud)

但这导致

类型错误:无法读取未定义的属性“get”

Ant*_*sss 5

你提供

{ snapshot: { params: convertToParamMap({ id: '1' }) } 所以是 snapshot.params

当您尝试通过访问它时 this.route.snapshot.paramMap

如您所见,paramMap您的模拟中没有。

您将对象作为“值”提供这一事实并不意味着该对象将自动成为ActivatedRoute. 它就是你定义的 - 普通对象。没有运行时类型控制,所以这是允许的。

您可以简单地提供部分实现,例如

 useValue: { snapshot: { paramMap: {get:(id:number)=>{id:1}}}}
Run Code Online (Sandbox Code Playgroud)

或在您的组件中为该属性创建 getter - 这将允许您spy调用该 getter 调用,拦截它并返回所需的值。