完整源代码:

import { Component, NgZone } from '@angular/core';
import { TestBed } from '@angular/core/testing';
import { Router } from '@angular/router';
import { RouterTestingModule } from '@angular/router/testing';
import { RoutingParamsService } from './routing-params.service';@Component({selector: 'cx-mock',template: '',
})
export class MockComponent {}describe('RoutingParamsService', () => {let service: RoutingParamsService;let router;let zone: NgZone;beforeEach(() => {TestBed.configureTestingModule({imports: [RouterTestingModule.withRoutes([{path: '',component: MockComponent,},{path: 'budgets',component: MockComponent,children: [{path: ':budgetCode',component: MockComponent,children: [{path: 'children/:childCode',component: MockComponent,},],},],},]),],declarations: [MockComponent],providers: [RoutingParamsService],});service = TestBed.inject(RoutingParamsService);router = TestBed.inject(Router);zone = TestBed.inject(NgZone);});it('should be created', () => {expect(service).toBeTruthy();});it('should not have any params for /budgets', async () => {let result;await zone.run(() => router.navigateByUrl('/budgets'));service.getParams().subscribe((params) => (result = params));expect(result).toEqual({});});it('should have param for /budgets/1234', async () => {let result;await zone.run(() => router.navigateByUrl('/budgets/1234'));service.getParams().subscribe((params) => (result = params));expect(result).toEqual({ budgetCode: '1234' });});it('should have params for /budgets/1234/children/5678', async () => {let result;await zone.run(() => router.navigateByUrl('/budgets/1234/children/5678'));service.getParams().subscribe((params) => (result = params));expect(result.budgetCode).toEqual('1234');expect(result.childCode).toEqual('5678');});it('should share child params', async () => {let result1;let result2;await zone.run(() => router.navigateByUrl('/budgets/1234'));service.getParams().subscribe((params) => (result1 = params));expect(result1.budgetCode).toEqual('1234');await zone.run(() => router.navigateByUrl('/budgets/1234/children/5678'));service.getParams().subscribe((params) => (result2 = params));expect(result1.budgetCode).toEqual('1234');expect(result2.childCode).toEqual('5678');});it('should clear all params', async () => {let result;await zone.run(() => router.navigateByUrl('/budgets/1234'));await zone.run(() => router.navigateByUrl('/budgets'));service.getParams().subscribe((params) => (result = params));expect(result).toEqual({});});
});

首先用RouterTestingModule.withRoutes构造一个支持Route的module出来,其返回作为输入,传入TestBed.configureTestingModule的imports数组里:

在单元测试代码里,使用zone.run启动一段代码,调用router.navigateByUrl进行跳转:

await zone.run(() => router.navigateByUrl('/budgets'));

待await返回后,可以调用subscribe获取RouteParamsService提取到的路由参数:

如果路由路径是/budgets/1234,根据之前的路由配置:

提取出的参数为budgetCpde: 1234

路径里包含子路径也是可以提取出来的:

更多Jerry的原创文章,尽在:“汪子熙”:

如何对SAP Spartacus支持路由的Component进行单元测试相关推荐

  1. SAP Spartacus 的路由配置

    Configurable Routing 在单页应用程序中,您可以通过显示应用程序的不同视图来控制用户看到的内容. Spartacus 使用 Angular Router 来处理从一个视图到另一个视图 ...

  2. SAP Spartacus支持的语言和货币单位的数据源

    打开SAP Spartacus Storefront,看到可以在四中语言和两种货币之间切换: 这些下拉菜单里的语言和货币,是Spartacus向Commerce Cloud发起的Restful API ...

  3. SAP Spartacus B2B页面Banner Component的路由url是在哪里定义的

    在Component wrapper里加上一行打印语句: 输出效果: 以CostCentersHomeLink为例:Spartacus里搜索不到,因为这是一个CMS Component: 从spart ...

  4. SAP Spartacus RouteGuard路由守卫之CmsPageGuard

    每个cms Component都能配置guards. 从后台加载CMS Component for a page之后,所有该Component的guards会执行. 从CmsPageGuard的实现代 ...

  5. 关于 SAP Spartacus 支持不同的环境配置部署到 SAP Commerce Cloud 上的讨论

    参考这个讨论:Introduce environment specific configurations for Spartacus deployment on ccv2 对于 angular 开发人 ...

  6. SAP Spartacus 支持 Vue 吗?

    Spartacus 是一个 Angular 框架,所以主要应用是 Angular 应用(不是 Vue). 然而,有可能在 Spartacus 中使用 Web 组件作为 CMS 组件(实验性支持),并且 ...

  7. SAP Spartacus B2B 页面 Popover Component 的条件显示逻辑

    如下图所示,这个 B2B 页面 的 Popover Component: 触发其的按钮位于 cx-org-card 内: 而下面这个 assigned users 明细页面,为什么就没有显示 Popo ...

  8. 如何自定义SAP Spartacus的路由路径

    地址:https://stackoverflow.com/questions/65830446/customise-spartacus-cart-path 以chart为例: By default i ...

  9. SAP Spartacus单元测试用例中Component构造函数的调用上下文

    我有一个Angular Component,构造函数的两个参数通过依赖注入指定. 在单元测试时候,观察这两个参数如何被注入的.在构造函数被调用之前,先执行实例的初始化逻辑: 观察此时的this: 最后 ...

最新文章

  1. 电子商务网站是这样诞生的
  2. (学习笔记)Jupyter notebook入门
  3. Django MTV模型思想
  4. SQL group by底层原理——本质是排序,可以利用索引事先排好序
  5. 家里wifi网速越来越慢_wifi太慢怎么办?简单的操作几步就能让网速飞快
  6. php正则替换模板变量,php正则替换变量指定字符的方法
  7. 高速缓冲存储器的功能、结构与工作原理
  8. http://blog.csdn.net/myan/article/details/1906
  9. 智能推荐系统的终极目标:“让你成为更好的自己”
  10. 关于ITIL4 认证你必须了解的知识
  11. 计算机 360云盘删除,删除360云盘图标,教你win7系统删除360云盘图标教程
  12. 官方高清标准地图素材下载地址
  13. 优秀的程序员是没有性生活的
  14. 植物大战僵尸C语言修改器
  15. 商汤科技VS旷视科技VS依图科技(转)
  16. 162_apt-cyg安装
  17. bandwagonhost.com (***)机房网速比较
  18. 2020美国纽约大学计算机科学排名,2020年美国纽约大学专业排名
  19. C语言编程习惯和修养
  20. OpenCV Java入门一 在MAC系统上安装OpenCV

热门文章

  1. Linux学习之CentOS(二十二)--单用户模式下修改Root用户的密码
  2. Python入门之中文乱码
  3. 类似于京东商城等的商品分类搜索筛选功能实现
  4. Mac解决Apache2目录权限问题
  5. Java调用webservice.asmx接口.
  6. JQuery radio(单选按钮)操作方法汇总
  7. Java开源权限管理中间件
  8. Asp.Net MVC 模型(使用Entity Framework创建模型类)
  9. 【转】asp.net中的WebApplication(web应用程序)和WebSite(网站)
  10. 手动写sonar 插件