我有一个抽象的通用服务类。
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
的{{1}}方法。我已经尝试过了:
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);
});
});
的全部get
方法?
答案 0 :(得分:1)
您可以考虑以下方法
GenericService.spec.js
import GenericSerice from "./GenericService";
class DummyService extends GenericSerice {}
describe("GenericSerice", () => {
beforeAll(() => {
global.fetch = jest.fn();
});
describe("extended by a class", () => {
let instance;
beforeAll(() => {
instance = new DummyService();
});
describe("method get", () => {
describe("with path given", () => {
const mockPath = "/pa/th";
describe("receiving successful response", () => {
let result;
const mockData = { key: "mock value" };
beforeAll(async () => {
global.fetch.mockClear();
global.fetch.mockResolvedValue({
ok: true,
json: jest.fn().mockResolvedValue(mockData)
});
result = await instance.get(mockPath);
});
it("should return data", () => {
expect(result).toEqual(mockData);
});
it("should request the correct URL", () => {
expect(global.fetch).toHaveBeenCalledWith(
"http://localhost/undefined/pa/th",
{
method: "GET"
}
);
});
});
});
});
});
});