在Jest单元测试中测试ActivatedRoute参数订阅

时间:2020-07-13 13:57:22

标签: angular unit-testing jestjs observable angular-observable

我需要根据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传递的,但是对于此测试,密钥应为null。

测试总是成功,但是为什么呢?

0 个答案:

没有答案