Angular 6 - 如何在单元测试中模拟 router.events url 响应

标签 angular typescript unit-testing

如标题所示,我需要在单元测试中模拟 router.events

在我的组件中,我做了一些正则表达式来获取 url 中斜线之间的第一个文本实例;例如,/pdp/

  constructor(
    private route: ActivatedRoute,
    private router: Router,
  }

this.router.events.pipe(takeUntil(this.ngUnsubscribe$))
      .subscribe(route => {
        if (route instanceof NavigationEnd) {
        // debugger
          this.projectType = route.url.match(/[a-z-]+/)[0];
        }
      });

我的单元测试在构建组件时出错:无法读取 null 的属性“0”。当我在调试器中评论时,route 似乎设置不正确,但我在单元测试本身中设置了它。我已经用几种不同的方式完成了(受这篇文章的启发:Mocking router.events.subscribe() Angular2 和其他人)。

第一次尝试:

providers: [
        {
          provide: Router,
          useValue: {
            events: of(new NavigationEnd(0, '/pdp/project-details/4/edit', 'pdp/project-details/4/edit'))
          }
        },
        // ActivatedRoute also being mocked
        {
          provide: ActivatedRoute,
          useValue: {
            snapshot: { url: [{ path: 'new' }, { path: 'edit' }] },
            parent: {
              parent: {
                snapshot: {
                  url: [
                    { path: 'pdp' }
                  ]
                }
              }
            }
          }
        }
]

第二次尝试(基于以上帖子):

class MockRouter {
  public events = of(new NavigationEnd(0, '/pdp/project-details/4/edit', '/pdp/project-details/4/edit'))
}

providers: [
        {
          provide: Router,
          useClass: MockRouter
        }
]

第三次尝试(也是基于上面的帖子):

class MockRouter {
  public ne = new NavigationEnd(0, '/pdp/project-details/4/edit', '/pdp/project-details/4/edit');
  public events = new Observable(observer => {
    observer.next(this.ne);
    observer.complete();
  });
}

providers: [
        {
          provide: Router,
          useClass: MockRouter
        }
]

第四次尝试:

beforeEach(() => {
    spyOn((<any>component).router, 'events').and.returnValue(of(new NavigationEnd(0, '/pdp/project-details/4/edit', 'pdp/project-details/4/edit')))
...

第五次尝试:

beforeEach(() => {
    spyOn(TestBed.get(Router), 'events').and.returnValue(of({ url:'/pdp/project-details/4/edit' }))
...

在上述所有情况下,route 都没有被设置; NavigationEnd 对象等于:

{ id: 1, url: "/", urlAfterRedirects: "/" }

想法?

最佳答案

它可以很简单:

TestBed.configureTestingModule({
  imports: [RouterTestingModule]
}).compileComponents()
    
...
    
const event = new NavigationEnd(42, '/', '/');
(TestBed.inject(Router).events as Subject<Event>).next(event);

关于Angular 6 - 如何在单元测试中模拟 router.events url 响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52901047/

相关文章:

unit-testing - 如何在 Grails 中使用静态成员模拟抽象类?

unit-testing - 如何对事件订阅进行单元测试

java - 在我的测试应用程序中缺少要测试的目标类

javascript - ng-select 添加带有异步搜索的新选项

javascript - @Input angular 2 遍数或对象变量

reactjs - TypeScript:属性 'checked' 在类型 'EventTarget & Element' 上不存在。为什么它不存在?

javascript - 在 Typescript 中为 Ramda 组合/管道函数声明类型

angular - 如何在拖动ngx-datatable的列时滚动水平滚动条,Angular4

angular - 如何在一个 Observable 上使用多个 debounceTime?

javascript - 删除一个可观察对象是否也会删除对它的订阅?