【问题标题】:Angular unit-testing mock paramMap getAngular 单元测试模拟 paramMap 获取
【发布时间】:2018-11-26 11:06:24
【问题描述】:

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

providers: [
                {
                    provide: ActivatedRoute,
                    useValue: { snapshot: { params: convertToParamMap({ id: '1' }) } }
                }
            ]

但这会导致

TypeError: 无法读取未定义的属性“get”

【问题讨论】:

    标签: angular unit-testing karma-runner


    【解决方案1】:

    你正在提供

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

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

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

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

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

     useValue: { snapshot: { paramMap: {get:(id:number)=>{id:1}}}}
    

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

    【讨论】:

    • 我如何存根这个this.route.queryParamMap.pipe(map(params => params.get('page') || 1)).subscribe。我试过queryParamMap: of(convertToParamMap({page: '23'})),但它会导致错误“意外值”
    • 另外,您能否提供一些链接,让我可以在 Angular 中学习单元测试? angular.io 看起来有点压倒性并提供信息,因此您执行辅助函数 AtiavatedRouteStub 并且不知道在哪里以及如何使用它。
    • this.route.queryParamMap 这可以是例如Observable.of(params)
    • 谢谢你 x 1000
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-19
    • 2018-11-24
    • 1970-01-01
    • 2016-11-23
    • 2019-08-12
    • 2023-04-07
    • 1970-01-01
    相关资源
    最近更新 更多