Мне нужно проверить, вызывается ли метод с правильными параметрами на основе результатов подписки 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
, но для этого теста ключ должен быть нулевым.
Тест всегда проходит успешно, но почему?