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

如何让依赖API的getQuote函数在单元测试中返回固定值?

解决方案

先修复测试的异步问题

你的exchange是异步函数,测试里必须用await等待它执行完成,不然断言会在函数还没跑完时就触发,结果肯定不符合预期:

describe("testing user methods", ()=>{
    const user = new User({cash: {"BRL": 100, "USD": 0}});
    it("exchange should work", async ()=>{ // 添加async标记
        let value = 100;
        let from_coin = "BRL";
        let to_coin = "USD";

        await user.exchange(value,from_coin,to_coin); // 添加await等待函数执行
        expect(user.cash["USD"]).toBe(19.2);
    })
});

方案一:直接Mock getQuote函数(推荐)

比起Mock axios,直接Mockexchange的直接依赖getQuote更简单,不需要模拟API返回的复杂结构:

假设getQuote是从单独模块(比如quote.ts)导出的,在测试文件开头添加Mock代码:

// 替换成你的getQuote实际所在的模块路径
jest.mock('./quote.ts', () => ({
  getQuote: jest.fn().mockResolvedValue(0.192) // 固定返回你需要的汇率值
}));

这样调用exchange时,getQuote会直接返回0.192,100*0.192=19.2,刚好匹配你的断言预期。

方案二:Mock axios.request(如果必须Mock axios)

如果你一定要Mock axios,得模拟出getQuote能解析的完整响应结构,不然getQuote会因为找不到对应字段而返回undefined:

import axios from 'axios';

// Mock整个axios模块
jest.mock('axios');
const mockedAxios = axios as jest.Mocked<typeof axios>;

beforeEach(() => {
  // 重置Mock,避免测试用例间互相干扰
  mockedAxios.request.mockReset();
  // 模拟axios.request返回符合getQuote预期的数据结构
  mockedAxios.request.mockResolvedValue({
    data: {
      "Meta Data": {
        "4. Last Refreshed": "2024-05-20 12:05:00"
      },
      "Time Series FX (5min)": {
        "2024-05-20 12:05:00": {
          "1. open": "0.192"
        }
      }
    }
  });
});

这样getQuote就能正确解析出汇率值0.192,最终exchange函数会计算出19.2的结果。

内容的提问来源于stack exchange,提问作者Pedro Emanuel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 21:55:48