INTEGRITY Документация

Подмена исходящих запросов

Используйте @msw/cloudflare чтобы замокать исходящие HTTP- и WebSocket-запросы с помощью @cloudflare/vitest-plugin. Интеграция поддерживает модульные тесты, которые вызывают экспортируемый обработчик вашего Worker, и интеграционные тесты, которые вызывают exports.default.fetch().

Установка зависимостей

Установите Mock Service Worker (MSW) версии 2.14 или новее и интеграцию с Cloudflare:

npm i -D msw@^2.14.0 @msw/cloudflare

Создайте мок сети

Создайте общий мок сети для своих тестов:

test/network.js
import { setupNetwork } from "@msw/cloudflare";

export const network = setupNetwork();
test/network.ts
import { setupNetwork } from "@msw/cloudflare";

export const network = setupNetwork();

В файле настройки Vitest запустите мок перед тестами, сбрасывайте обработчики после каждого теста и останавливайте мок после завершения всех тестов:

test/setup.js
import { afterAll, afterEach, beforeAll } from "vitest";
import { network } from "./network";

beforeAll(() => network.enable());
afterEach(() => network.resetHandlers());
afterAll(() => network.disable());
test/setup.ts
import { afterAll, afterEach, beforeAll } from "vitest";
import { network } from "./network";

beforeAll(() => network.enable());
afterEach(() => network.resetHandlers());
afterAll(() => network.disable());

Добавьте файл настройки в setupFiles массив в конфигурации Vitest.

Мокирование HTTP-запроса

Используйте network.use() и обработчики запросов MSW, чтобы возвращать ответ на исходящий запрос. В этом примере тестируется Worker, который запрашивает приветствие у внешнего API:

src/index.js
export default {
	async fetch() {
		return fetch("https://api.example.com/greeting");
	},
};
src/index.ts
export default {
	async fetch(): Promise<Response> {
		return fetch("https://api.example.com/greeting");
	},
} satisfies ExportedHandler;
test/worker.test.js
import {
	createExecutionContext,
	waitOnExecutionContext,
} from "cloudflare:test";
import { env } from "cloudflare:workers";
import { http, HttpResponse } from "msw";
import { expect, it } from "vitest";
import worker from "../src";
import { network } from "./network";

it("mocks an outbound request", async () => {
	network.use(
		http.get("https://api.example.com/greeting", () => {
			return HttpResponse.json({ message: "Hello" });
		}),
	);

	const ctx = createExecutionContext();
	const response = await worker.fetch(
		new Request("https://example.com"),
		env,
		ctx,
	);
	await waitOnExecutionContext(ctx);
	expect(await response.json()).toEqual({ message: "Hello" });
});
test/worker.test.ts
import { createExecutionContext, waitOnExecutionContext } from "cloudflare:test";
import { env } from "cloudflare:workers";
import { http, HttpResponse } from "msw";
import { expect, it } from "vitest";
import worker from "../src";
import { network } from "./network";

it("mocks an outbound request", async () => {
	network.use(
		http.get("https://api.example.com/greeting", () => {
			return HttpResponse.json({ message: "Hello" });
		}),
	);

	const ctx = createExecutionContext();
	const response = await worker.fetch(
		new Request("https://example.com"),
		env,
		ctx,
	);
	await waitOnExecutionContext(ctx);
	expect(await response.json()).toEqual({ message: "Hello" });
});

Мокирование исходящего WebSocket-соединения

Используйте MSW ws.link() API для имитации WebSocket-соединения, созданного вашим Worker. фикстура для мокирования запроса включает HTTP, exports.default.fetch(), и примеры WebSocket.