Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/442.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 角度测试Jest-类型错误:无法读取属性';查询参数';未定义的_Javascript_Angular_Testing_Jestjs_Angular Activatedroute - Fatal编程技术网

Javascript 角度测试Jest-类型错误:无法读取属性';查询参数';未定义的

Javascript 角度测试Jest-类型错误:无法读取属性';查询参数';未定义的,javascript,angular,testing,jestjs,angular-activatedroute,Javascript,Angular,Testing,Jestjs,Angular Activatedroute,我在其他帖子中也看到过同样的错误,但它们对我不起作用 我有一个角度组件,我需要从url中读取查询参数,例如在http://localhost:4200/sample-page?page=3我想将数字3存储到组件局部变量中 /** * Set page by url parameter */ export const setPaginationMarkByUrlParam = (activatedRoute): number => { // Get page param from U

我在其他帖子中也看到过同样的错误,但它们对我不起作用

我有一个角度组件,我需要从url中读取查询参数,例如在
http://localhost:4200/sample-page?page=3
我想将数字3存储到组件局部变量中

/**
 * Set page by url parameter
 */
export const setPaginationMarkByUrlParam = (activatedRoute): number => {
  // Get page param from Url to set pagination page
  const pageParam = activatedRoute.snapshot.queryParams;
  return pageParam.page ? Number(pageParam.page) : 1;
};
这个函数在另一个文件中,我将activeRoute作为参数,它来自我想要获取queryParam的组件的ngOnInit

ngOnInit() {
    this.page = setPaginationMarkByUrlParam(this.activatedRoute);
}
这段代码工作得很好,但是当Jenkins管道运行
npx jest
测试时,我得到以下消息:
TypeError:无法读取未定义的属性“queryParams”

我的规格:

beforeEach(() => {
      TestBed.configureTestingModule({
        ...,
        providers: [
          {
            provide: ActivatedRoute,
            useValue: {
              data: {
                subscribe: (fn: (value: Data) => void) =>
                  fn({
                    pagingParams: {
                      predicate: 'id',
                      reverse: false,
                      page: 0
                    }
                  })
              }
            }
          }
        ]...

it('Should call load all on init', () => {
      // GIVEN
      const headers = new HttpHeaders().append('link', 'link;link');
      spyOn(service, 'query').and.returnValue(
        of(
          new HttpResponse({
            body: [new DataSource(123)],
            headers
          })
        )
      );

      // WHEN
      comp.ngOnInit();

      // THEN
      expect(service.query).toHaveBeenCalled();
      expect(comp.dataSources[0]).toEqual(jasmine.objectContaining({ id: 123 }));
    });
测试在
comp.ngOnInit()中失败函数

我没有任何类型的私有变量,activeRoute作为一个参数,我尝试了public和private

从StackOverflow和GitHub两个问题来看,我都无法解决这个问题


多谢各位

当您在模拟
数据
时,您没有在ActivatedRoute上模拟
快照
。要实现这一点,您有三种选择:

首先,你应该考虑使用ActudiaDroutStub作为。这样做很容易:
activatedRoute.setParamMap({page:3})
设置要设置的任何查询参数。此选项需要更多的测试代码

  • 下一个选项:这将模拟ActivatedRoute上
    页面
    的queryParameter,使用可观察的:

  • 如果由于您的问题中未披露的原因,您不需要从ActivatedRoute中观察到,这将是备用代码:
  • 最后,您提供的代码没有为ActivatedRoute提供程序调用
    inject
    ,也没有显示测试组件的创建。因此,至少要确保您也在这样做:

    要么:

    fixture=TestBed.createComponent(…)

    或:

    activatedRoute=TestBed.inject(activatedRoute)


    如果这些建议都不能解决您的问题,那么进行一次最小规模的StackBlitz,演示问题,我们会让它工作。

    您是在嘲笑激活的路线吗?您的测试床配置是什么样子的?@RandyCasburn我已经用spect文件更新了帖子,请考虑:
      provide: ActivatedRoute, useValue: {
        snapshot: of(queryParams: { page: 3 }),
      }
    
      provide: ActivatedRoute, useValue: {
        snapshot: { queryParams: { page: 3 } }
      }