You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Deno中Mock MongoDB数据库/客户端?求推荐适用于Deno测试场景的Mock工具库

在Deno中实现测试Mock的工具库与方案

我来帮你梳理下Deno里做测试Mock的可行方案,毕竟官方测试模块确实只带了断言功能,Mock得靠其他工具或者手动实现~

一、利用Deno标准库的Mock工具

Deno的标准库std/testing/mock模块提供了基础但实用的Mock能力,足够应付大部分常规场景:

  • 创建追踪式Mock函数:用spy()或fn()方法可以生成一个能记录调用细节的Mock函数,包括调用次数、传入参数、返回值等信息。举个实际例子:
import { assertSpyCall, spy } from "https://deno.land/std/testing/mock.ts";
import { assertEquals } from "https://deno.land/std/testing/asserts.ts";

Deno.test("mock network call function", async () => {
  // 模拟一个发起网络请求的函数
  const fetchData = spy(() => Promise.resolve({ data: "mock response" }));

  // 调用这个Mock函数
  await fetchData();

  // 断言函数确实被调用过一次
  assertSpyCall(fetchData, 0);
  // 验证返回值符合预期
  assertEquals(await fetchData(), { data: "mock response" });
});
  • 替换模块导出:如果需要Mock整个模块的导出(比如封装了网络请求的工具模块),可以用mockModule()方法替换指定模块的导出内容,从而拦截模块的实际调用。

二、第三方Mock库(适合复杂场景)

如果标准库的功能满足不了你的需求,还有几个成熟的第三方库可以选择:

  • Mockito Deno:这是Java生态中知名Mockito的Deno移植版,语法直观,支持Mock实例、Stub返回值、验证调用行为等丰富功能,非常适合复杂的测试场景。示例代码:
import { mock, when, verify } from "https://deno.land/x/mockito@v0.3.2/mod.ts";
import { assertEquals } from "https://deno.land/std/testing/asserts.ts";

// 定义一个HTTP客户端接口
interface HttpClient {
  get(url: string): Promise<string>;
}

Deno.test("mock http client with mockito", async () => {
  // 创建接口的Mock实例
  const client = mock<HttpClient>();

  // 设定:当调用get方法传入指定URL时,返回预设的Mock响应
  when(client.get("https://example.com")).thenReturn(Promise.resolve("mock content"));

  // 调用Mock实例的方法
  const result = await client.get("https://example.com");

  // 验证返回值正确
  assertEquals(result, "mock content");
  // 验证方法确实被调用了一次
  verify(client.get("https://example.com")).calledTimes(1);
});
  • deno-mock:另一个轻量易用的Mock库,支持函数Mock、模块Mock,用法简洁,适合快速上手搭建测试用例。

三、手动Mock(零依赖方案)

如果不想引入任何额外依赖,也可以手动实现Mock逻辑,适合简单场景:
比如要Mock一个网络请求函数,直接在测试中替换原函数即可,记得测试后恢复原函数避免污染其他测试用例:

// 原模块:api.ts
export async function fetchFromApi(url: string) {
  const res = await fetch(url);
  return res.json();
}

// 测试文件:api.test.ts
import * as apiModule from "./api.ts";
import { assertEquals } from "https://deno.land/std/testing/asserts.ts";

Deno.test("manual mock fetch function", async () => {
  // 保存原函数引用
  const originalFetch = apiModule.fetchFromApi;
  // 替换为Mock函数
  apiModule.fetchFromApi = async () => ({ data: "manual mock data" });

  try {
    const result = await apiModule.fetchFromApi("https://example.com");
    assertEquals(result, { data: "manual mock data" });
  } finally {
    // 测试结束后恢复原函数
    apiModule.fetchFromApi = originalFetch;
  }
});

内容的提问来源于stack exchange,提问作者IT-Nerdo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 16:42:40