如何让依赖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
相关产品推荐
相关产品推荐

