用Jest中的测试覆盖抽象类方法

时间:2019-11-16 09:39:37

标签: javascript typescript jestjs

我有一个抽象的通用服务类。

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方法?

1 个答案:

答案 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"
              }
            );
          });
        });
      });
    });
  });
});

检查full coverage example here