使用Sinon、Mocha、Chai做JS单元测试时疑惑mock Ajax的代码作用
Sinon Ajax测试用例逐行逻辑拆解
这组测试的核心目标是验证getTodos函数发起API请求时的参数正确性,全程不会触发真实的网络请求,所有外部依赖都会被替换为可追踪的模拟实现,避免测试受外部网络环境影响、产生额外副作用。
测试用例核心三行代码的作用
第一行:sinon.replace(jQuery, "ajax", sinon.fake());
- 执行依赖替换:将
jQuery对象原生的ajax方法(原本会触发真实HTTP请求的实现),替换为Sinon生成的空实现假函数 - 替换后的假函数没有任何真实业务逻辑,不会发出网络请求,但会完整记录自身的调用次数、调用时传入的所有参数、调用上下文等信息,供后续校验
- 测试执行结束后,Sinon会自动将
jQuery.ajax恢复为原始实现,避免污染其他测试用例的运行环境
第二行:getTodos(42, sinon.fake());
- 正式执行被测函数:传入构造好的测试入参,其中
listId固定传入测试值42,回调参数传入无副作用的Sinon假函数,避免执行过程中触发真实的回调逻辑 - 执行过程中,
getTodos内部会调用第一步替换好的假jQuery.ajax方法,将自身构造的请求配置传入该方法
第三行:assert(jQuery.ajax.calledWithMatch({ url: "/todo/42/items" }));
- 执行断言校验:读取之前替换的假
jQuery.ajax的调用记录,验证这个假方法至少被调用过一次,且调用时传入的参数中,url字段和预期值/todo/42/items完全匹配 calledWithMatch是Sinon提供的宽松匹配方法,不要求传入的所有请求配置字段都和预期完全一致,只要我们关心的核心字段(这里是请求url)符合要求,断言就会通过
测试逻辑的校验闭环
对照提供的getTodos源码,当传入listId=42时,函数内部拼接出的请求url为"/todo/" + listId + "/items",正好等于预期的/todo/42/items。如果函数内部的url拼接逻辑出错(比如漏了斜杠、拼错路径字段),断言会直接抛出错误,标记测试不通过。
内容的提问来源于stack exchange,提问作者duplek
相关产品推荐
相关产品推荐

