如何在路由参数更改时测试ngrx存储操作调度?

凯蒂娅·克里斯塔

我正在测试一个组件,当单击按钮时,该组件会显示ngrx存储中的一些数据。

单击按钮后,路线参数会更改

  <button
    class="submit"
    [routerLink]="['/page']"
    [queryParams]="{
      period_start: '01.01.19',
      period_end: '01.01.19',
      submit_search: '->'
    }"
  >
  </button>

如果参数之一是submit_search,那么我将在init上订阅路由参数的更改并调度存储操作。运行测试时,不会记录任何文本。

  ngOnInit() {
    this.route.queryParams.subscribe(params => {
      console.log('Before params.submit_search');
      if (params.submit_search) {
        console.log('In params.submit_search');
        this.store.dispatch(...);
      }
    });
  }

此测试知道点击后的路由已更改(此测试通过):

    it('should set route params to filter params', fakeAsync(() => {
      const filterButtonElement = fixture.nativeElement.querySelector('.submit');
      filterButtonElement.click();
      tick();
      expect(location.path()).toEqual(
        `'/page?period_start=01.01.19&period_end=01.01.19&submit_search=-%3E'`
      );
    }));

但是此测试表明“派遣”已被调用0次,因此订阅尚未注册路由更改:

describe('SomeComponent', () => {
  let dispatchSpy;
  let location: Location;
  let router: Router;
  let route: ActivatedRoute;
  let component: SomeComponent;
  let fixture: ComponentFixture<SomeComponent>;
  let mockStore: MockStore<State>;
  let mockGetData: MemoizedSelector<State, SomeData[]>;
  const initialState = {};
  beforeEach(async(() => {
    TestBed.configureTestingModule({
      imports: [
        HttpClientTestingModule,
        RouterTestingModule.withRoutes([
          {
            path: 'page',
            component: SomeComponent
          }
        ]),
      ],
      declarations: [SomeComponent],
      providers: [
        provideMockStore({ initialState }),
        { provide: ActivatedRoute, useValue: { queryParams: from([]) } }
      ]
    }).compileComponents();
    router = TestBed.get(Router);
    route = TestBed.get(ActivatedRoute);
    location = TestBed.get(Location);
  }));
  beforeEach(() => {
    fixture = TestBed.createComponent(SomeComponent);
    component = fixture.componentInstance;
    mockStore = TestBed.get(Store);
    mockGetData = mockStore.overrideSelector(SomeSelectors.selectData, []);
    router.initialNavigation();
    fixture.detectChanges();
  });
    it('should dispatch store action', fakeAsync(() => {
      dispatchSpy = spyOn(mockStore, 'dispatch');
      const filterButtonElement = fixture.nativeElement.querySelector('.submit');
      filterButtonElement.click();
      tick();
      expect(dispatchSpy).toHaveBeenCalledTimes(1);
    }));
});

为什么未触发订阅?我应该以其他方式提供ActivatedRoute参数吗?

阿里F50

似乎您不得不嘲笑自己ActivatedRoute想要的东西。

如此更改提供ActivatedRoute,这有望使您畅通无阻。

  import { of } from 'rxjs';
  //.....
  providers: [.... 
              {
                 provide: ActivatedRoute, 
                 useValue: { queryParams: of({ submit_search: 'hello', })
               }],

现在,要获取一种更改的值的方法queryParams,您可以执行以下操作:

let dispatchSpy;
let queryParamsValue = new BehaviorSubject({ submit_search: 'hello', });
....
// bind this behavior subject to queryParams in the provider
  useValue: { queryParams: queryParamsValue }

然后在测试中,您可以执行以下操作:queryParamsValue.next({ ... });更改queryParamsare的值并开始订阅。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Angular 如何取消路由参数更改时的 http 调用

来自分类Dev

如何在路由更改时显示来自db的数据?

来自分类Dev

如何在依赖路由参数的 ngOnInit 中测试 if 语句

来自分类Dev

ngrx action:如何测试该动作是否已调度

来自分类Dev

如何测试NgRX中是否调度了动作?

来自分类Dev

Angular路由器更改时的分派操作

来自分类Dev

angular ui-router:如何在路径参数更改时重新加载状态,但在查询参数更改时如何不重新加载状态?

来自分类Dev

网站更改时的操作

来自分类Dev

如何在 ngrx 中测试效果?

来自分类Dev

如何在python中更改时间?

来自分类Dev

如何在JavaScript中更改时区?

来自分类Dev

如何在目录更改时更新提示

来自分类Dev

如何在文件更改时更新UI

来自分类Dev

如何在更改时保存按钮

来自分类Dev

如何在 ViewModel 更改时让 View 更新

来自分类Dev

当路由器的IP地址可能更改时,如何在家在家SSH到我的机器?

来自分类Dev

仅在Rxjs轮询上某些属性发生更改时才分派NgRx操作

来自分类Dev

仅在Rxjs轮询上某些属性发生更改时才分派NgRx操作

来自分类Dev

如何在JUnit 5扩展中存储值并如何在参数化测试中进行注入

来自分类Dev

如何响应Redux中的状态更改并调度其他操作?

来自分类Dev

如何响应Redux中的状态更改并调度其他操作?

来自分类Dev

功能模块中的 Angular 5 路由问题(强制路由器在路径相同但参数更改时重新加载路由)

来自分类Dev

React Router + Redux-在路由更改时分派异步操作?

来自分类Dev

流星铁路由器仅在路径更改时才执行操作

来自分类Dev

React Router + Redux-在路由更改时分派异步操作?

来自分类Dev

如何在输入框更改时更改标签标签?

来自分类Dev

如何在进度更改时更改UIProgressView颜色

来自分类Dev

如何在状态更改时更改导航栏模板?

来自分类Dev

如何在幻灯片更改时更改 img 的 href

Related 相关文章

  1. 1

    Angular 如何取消路由参数更改时的 http 调用

  2. 2

    如何在路由更改时显示来自db的数据?

  3. 3

    如何在依赖路由参数的 ngOnInit 中测试 if 语句

  4. 4

    ngrx action:如何测试该动作是否已调度

  5. 5

    如何测试NgRX中是否调度了动作?

  6. 6

    Angular路由器更改时的分派操作

  7. 7

    angular ui-router:如何在路径参数更改时重新加载状态,但在查询参数更改时如何不重新加载状态?

  8. 8

    网站更改时的操作

  9. 9

    如何在 ngrx 中测试效果?

  10. 10

    如何在python中更改时间?

  11. 11

    如何在JavaScript中更改时区?

  12. 12

    如何在目录更改时更新提示

  13. 13

    如何在文件更改时更新UI

  14. 14

    如何在更改时保存按钮

  15. 15

    如何在 ViewModel 更改时让 View 更新

  16. 16

    当路由器的IP地址可能更改时,如何在家在家SSH到我的机器?

  17. 17

    仅在Rxjs轮询上某些属性发生更改时才分派NgRx操作

  18. 18

    仅在Rxjs轮询上某些属性发生更改时才分派NgRx操作

  19. 19

    如何在JUnit 5扩展中存储值并如何在参数化测试中进行注入

  20. 20

    如何响应Redux中的状态更改并调度其他操作?

  21. 21

    如何响应Redux中的状态更改并调度其他操作?

  22. 22

    功能模块中的 Angular 5 路由问题(强制路由器在路径相同但参数更改时重新加载路由)

  23. 23

    React Router + Redux-在路由更改时分派异步操作?

  24. 24

    流星铁路由器仅在路径更改时才执行操作

  25. 25

    React Router + Redux-在路由更改时分派异步操作?

  26. 26

    如何在输入框更改时更改标签标签?

  27. 27

    如何在进度更改时更改UIProgressView颜色

  28. 28

    如何在状态更改时更改导航栏模板?

  29. 29

    如何在幻灯片更改时更改 img 的 href

热门标签

归档