unit-testing - 在 Deno 中对 global.fetch 进行 Stubbing / Spy
问题描述
我刚刚进入 Deno,我有点不确定的一件事是如何为全局 fetch 函数存根或创建一个间谍?
一种解决方案是简单地将 fetch 包装在一个函数中,该函数本身可以被存根或监视,但这似乎是不必要的抽象。
任何帮助将非常感激。
解决方案
使用 denock,您可以模拟 fetch 调用的返回对象。也许不是您想要的,但现在您无需真正调用服务器即可进行测试。
https://deno.land/x/denock@0.2.0
import { assertEquals } from "https://deno.land/std/testing/asserts.ts";
import { denock } from "https://deno.land/x/denock/mod.ts";
// function to test
async function fetchFromServer() {
const urlObject = new URL("https://jsonplaceholder.typicode.com/todos");
const response = await fetch(urlObject, {
method: "POST",
headers: new Headers({
"content-type": "application/json",
}),
body: JSON.stringify({
userId: 2,
id: 23024,
title: "delectus aut autem",
completed: false,
}),
});
return await response.json();
}
// mock return
denock({
method: "POST",
protocol: "https",
host: "jsonplaceholder.typicode.com",
headers: [
{
header: "content-type",
value: "application/json",
},
],
path: "/todos",
requestBody: {
userId: 2,
id: 23024,
title: "delectus aut autem",
completed: false,
},
replyStatus: 201,
responseBody: { example: "My mocked response" },
});
// test
Deno.test("fetch", async () => {
const actual = await fetchFromServer();
assertEquals({ example: "My mocked response" }, actual);
});