Протестируйте подписку ActivatedRoute params в модульном тесте Jest - PullRequest
0 голосов
/ 13 июля 2020

Мне нужно проверить, вызывается ли метод с правильными параметрами на основе результатов подписки ActivatedRoute.

Шаблон:

ngOnInit() {
  let projectKey: string;
  const projectKeyFromStorage = this.getProjectKeyFromStorage();
  this.route.params.subscribe(param => {
    if (!param.key) {
      if (!projectKeyFromStorage) {
        this.switchToErrorDisplay('NO_PROJECT_KEY');
      }
      projectKey = projectKeyFromStorage;
    } else {
      projectKey = param.key;
    }
    this.loadProjectData(projectKey);
  });
}

В тесте я хочу проверить это используется ключ проекта из хранилища, а не из URL.

Тест:

describe('ProjectPageComponent', () => {
  let component: ProjectPageComponent;
  let fixture: ComponentFixture<ProjectPageComponent>;
  let route: ActivatedRoute;

  const mockStorageService = {
    saveItem: jest.fn(),
    getItem: jest.fn(),
    removeItem: jest.fn(),
    removeAll: jest.fn()
  };

  const mockActivatedRoute = {
    params: {
      subscribe: jest.fn()
    }
  };

  beforeEach(async(() => {
    TestBed.configureTestingModule({
      ...
      providers: [
        { provide: ActivatedRoute, useValue: mockActivatedRoute },
        { provide: StorageService, useValue: mockStorageService }
      ]
      ...
    })
  });

  it('when project key is not in URL but in storage, should use project key from storage', fakeAsync(done => {
    mockStorageService.getItem.mockImplementation(() => 'FOO1');
    jest
      .spyOn(mockActivatedRoute.params, 'subscribe')
      .mockReturnValue(of(EMPTY));
    fixture.detectChanges();
    mockActivatedRoute.params.subscribe(param => {
      expect(component.loadProjectData).toHaveBeenCalledWith('FOO2'); // should return false in case of 'FOO2', but always returns true
      done();
    });
  }));
...

В маршрутизации проект передается через project/:key, но для этого теста ключ должен быть нулевым.

Тест всегда проходит успешно, но почему?

...