MSW
如果您想生成模拟,请将 mock 属性定义为 true,将在目标文件中生成 MSW 的模拟。您可以查看 MSW 以在项目中正确配置 MSW。
orval.config.js 示例
module.exports = {'petstore-file-transfomer': {output: {mode: 'single',target: './src/petstore.ts',schemas: './src/model',mock: true,},input: {target: './petstore.yaml',},},};
模拟定义由以下三个函数组成。
- 返回模式对象模拟值的函数
- 返回将模拟对象绑定到
MSWHTTP 请求处理器的值的函数 - 返回聚合文件中所有处理器的
Array的函数
返回模式对象模拟值的函数
返回模拟对象的函数将按如下方式生成:
import { faker } from '@faker-js/faker';export const getShowPetByIdResponseMock = (overrideResponse: Partial<Pet> = {},): Pet => ({id: faker.number.int({ min: undefined, max: undefined }),name: faker.string.alpha(20),tag: faker.string.alpha(20),...overrideResponse,});
该值在 faker.js 中实现。
如果您想覆盖对象的一部分,可以通过将其指定为函数参数来编写模拟值。
import { getShowPetByIdMock } from 'pets.msw';const pet = getShowPetByIdResponseMock({ name: 'override' });console.log(pet);// => { id: 7272122785202176, name: "override", tag: undefined }
返回将模拟对象绑定到 MSW HTTP 请求处理器的值的函数
生成一个函数,返回绑定到 MSW HTTP 请求处理器的模拟对象的值,如下所示:
import { HttpResponse, delay, http } from 'msw';export const getShowPetByIdMockHandler = (overrideResponse?:| Pet| ((info: Parameters<Parameters<typeof http.get>[1]>[0],) => Promise<Pet> | Pet),) => {return http.get('*/pets/:petId', async (info) => {await delay(1000);return new HttpResponse(JSON.stringify(overrideResponse !== undefined? typeof overrideResponse === 'function'? await overrideResponse(info): overrideResponse: getShowPetByIdResponseMock(),),{status: 200,headers: {'Content-Type': 'application/json',},},);});};
如果您想覆盖模拟的 HTTP 响应对象,可以通过将其指定为函数参数来编写对象。
import { Pet } from './gen/model/pet';import { getShowPetByIdMockHandler } from 'petstore.msw';const pet: Pet = { id: 1, name: 'test', tag: 'test' };const showPetByIdMockHandler = getShowPetByIdMockHandler(pet);console.log(showPetByIdMockHandler);// => Object { info: {…}, isUsed: false, resolver: async getShowPetByIdMockHandler(), resolverGenerator: undefined, resolverGeneratorResult: undefined, options: {} }
您也可以传递一个函数作为参数,每次向 API 发出请求时都会调用该函数。
getShowPetByIdMockHandler((info) => {const body = await info.request.json();return { message: `body: ${body}` };});
例如,如果您想在测试中使用生成的模拟来验证 API 是否被调用,可以按如下方式使用:
import { expect, vi } from 'vitest';import { getShowPetByIdMock, getShowPetByIdMockHandler } from 'pets.msw';const mockFn = vi.fn();const mock = [getShowPetByIdMockHandler((info) => {const body = await info.request.json();mockFn(body);return getShowPetByIdResponseMock();}),];expect(mockFn).toHaveBeenCalledTimes(1);
返回聚合文件中所有处理器的 Array 的函数
聚合所有返回处理器的函数,并生成一个返回 Array 的函数,如下所示:
export const getPetsMock = () => [getListPetsMockHandler(),getCreatePetsMockHandler(),getShowPetByIdMockHandler(),];
您可以使用此函数运行 MSW 服务器。
import { getPetsMock } from 'petstore.msw';import { setupServer } from 'msw/node';const server = setupServer();server.use(...getPetsMock());
Was this page helpful?