【发布时间】:2020-03-12 08:04:36
【问题描述】:
我有一个抽象的通用服务类。
export default abstract class GenericService<Type> implements CrudService<Type> {
private readonly modifiedUrl: URL;
public constructor(url: string) {
this.modifiedUrl = new URL(url, window.location.href);
}
public async get(path?: string, filter?: URLSearchParams): Promise<Type> {
try {
if (path) {
this.modifiedUrl.href += `${path}`;
}
addQueryParams(this.modifiedUrl, filter);
const response = await handleRequest(`${this.modifiedUrl}`, getFetchOptions('GET'));
const data = await response.json();
return (await data.data) ? data.data : data;
} catch (error) {
throw new Error(`Runtime error: ${error}`);
}
}
}
export async function handleRequest(input: RequestInfo, init: RequestInit): Promise<Response> {
const response = await fetch(input, init);
if (!response.ok) {
throw new Error(`Network response was not ok: ${response}`);
}
return response;
}
我需要用测试覆盖这个GenericService 的get 方法。我试过这个:
jest.mock('../../components/crudTable/service/GenericService');
const genericService = GenericService;
export class DummyClass {
public name: string = '';
}
export class DummyService extends GenericService<DummyClass> {}
describe('Generic Service', () => {
it('1- spy prototype function', async () => {
const spy = jest.spyOn(genericService.prototype, 'get');
await genericService.prototype.get();
expect(spy).toHaveBeenCalledTimes(1);
});
it('2- mock prototype function', async () => {
const mockFn = jest.fn(genericService.prototype.get);
await mockFn();
expect(mockFn).toHaveBeenCalledTimes(1);
});
it('3- mock subclass function', async () => {
const dummyService = new DummyService('test url');
const mockFn = jest.fn(dummyService.get);
await mockFn();
expect(mockFn).toHaveBeenCalledTimes(1);
});
});
此测试有效,但覆盖率统计显示它仍未被覆盖。
那么如何隐藏GenericService的所有get方法呢?
【问题讨论】:
标签: javascript typescript jestjs