测试
最好在支持 TypeScript 的测试运行器中进行 openapi-fetch 的测试,比如 Vitest 或 Jest。
模拟请求
要测试请求,可以使用 fetch
选项并提供任何 spy 函数,比如 vi.fn()
(Vitest)或 jest.fn()
(Jest)。
ts
import createClient from "openapi-fetch";
import { expect, test, vi } from "vitest";
import type { paths } from "./my-openapi-3-schema"; // 由openapi-typescript生成
test("my request", async () => {
const mockFetch = vi.fn();
const client = createClient<paths>({
baseUrl: "https://my-site.com/api/v1/",
fetch: mockFetch,
});
const reqBody = { name: "test" };
await client.PUT("/tag", { body: reqBody });
const req = mockFetch.mock.calls[0][0];
expect(req.url).toBe("/tag");
expect(await req.json()).toEqual(reqBody);
});
Mocking Responses
Mock Service Worker is highly recommended for mocking API responses in tests:
ts
import { http, HttpResponse } from "msw";
import { setupServer } from "msw/node";
import createClient from "openapi-fetch";
import { afterEach, beforeAll, expect, test } from "vitest";
import type { paths } from "./my-openapi-3-schema"; // generated by openapi-typescript
const server = setupServer();
beforeAll(() => {
// NOTE: server.listen must be called before `createClient` is used to ensure
// the msw can inject its version of `fetch` to intercept the requests.
server.listen({
onUnhandledRequest: (request) => {
throw new Error(
`No request handler found for ${request.method} ${request.url}`
);
},
});
});
afterEach(() => server.resetHandlers());
afterAll(() => server.close());
test("my API call", async () => {
const rawData = { test: { data: "foo" } };
const BASE_URL = "https://my-site.com";
server.use(
http.get(`${BASE_URL}/api/v1/foo`, () =>
HttpResponse.json(rawData, { status: 200 })
)
);
const client = createClient<paths>({
baseUrl: BASE_URL,
});
const { data, error } = await client.GET("/api/v1/foo");
expect(data).toEqual(rawData);
expect(error).toBeUndefined();
});