我需要根据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。
测试总是成功,但是为什么呢?