如何用Sinon正确Mock require('uuid/v1')以获取指定SessionId?
解决直接mock uuid/v1单函数的Sinon测试问题
我之前也碰到过一模一样的问题!核心原因是你现在导入的uuid/v1是单个导出函数,而不是像原来那样是包含多个方法的模块对象,所以Sinon的mock用法得跟着调整才行。
为什么原来的写法有效?
之前你用const uuid = require('uuid')导入的是一个模块对象,v1是它的一个方法,所以sinon.mock(require('uuid'))拿到的是对象,然后用expects('v1')去断言这个方法的调用完全没问题。
现在的问题出在哪?
当你改成const uuidv1 = require('uuid/v1')时,你直接导入的就是v1这个函数本身,不是一个带方法的对象。这时候用sinon.mock(uuidv1)得到的mock对象,和之前针对模块对象的mock用法逻辑不一样,所以returns()和expects()都会报错。
正确的测试写法(两种常用方式)
方式一:用Sinon Stub(更推荐)
Stub专门用来替换函数或方法的实现,对于单个导出函数的场景最直观:
const sinon = require('sinon'); // 直接stub uuid/v1这个函数,指定返回值 const uuidv1Stub = sinon.stub(require('uuid/v1')).returns('00000000-0000-0000-0000-000000000000'); // 执行你的测试逻辑,比如调用生成sessionId的代码... // 测试完成后恢复原函数,避免影响其他测试 uuidv1Stub.restore();
方式二:用Sinon Mock(针对函数调用的断言)
如果你一定要用Mock来做调用次数的断言,可以这样写,因为Mock单个函数时需要断言它的call行为:
const sinon = require('sinon'); const uuidv1 = require('uuid/v1'); const mockUuid = sinon.mock(uuidv1); // 期望这个函数被调用一次,并且返回指定值 mockUuid.expects('call').once().returns('00000000-0000-0000-0000-000000000000'); // 执行测试逻辑... // 验证mock的调用是否符合预期 mockUuid.verify(); // 恢复原函数 mockUuid.restore();
小提示
不管用哪种方式,记得在测试结束后调用restore(),把被替换的函数恢复原样,不然会干扰其他测试用例的执行哦!
内容的提问来源于stack exchange,提问作者Dave Chambers
相关产品推荐
相关产品推荐

