如何用Node.js原生测试库实现多次调用的不同Mock返回?
解决Node.js原生测试Mock多次调用返回不同值的问题
你之前用Sinon的写法(顺带提一句,你Sinon代码里连续三次onFirstCall其实只会生效最后一次,正确应该用onFirstCall、onSecondCall、onThirdCall,不过这是题外话),迁移到Node.js原生mock时踩了个小坑。
你的无效代码问题出在错误地调用了mock.fn().mock,mock.fn()返回的模拟函数本身就带有mockImplementationOnce方法,不需要去访问它的mock属性。直接在模拟函数上链式调用mockImplementationOnce就能实现多次调用返回不同值的需求。
正确的写法如下:
import { mock } from "node:test" // 直接操作mock.fn()返回的函数,链式设置每次调用的返回值 const myMock = mock.fn() .mockImplementationOnce(() => 1) .mockImplementationOnce(() => 2) .mockImplementationOnce(() => 3) functionWhichExecutesMyMockThreeTimes()
或者也可以分开写:
import { mock } from "node:test" const myMock = mock.fn() myMock.mockImplementationOnce(() => 1) myMock.mockImplementationOnce(() => 2) myMock.mockImplementationOnce(() => 3) functionWhichExecutesMyMockThreeTimes()
这样不管黑盒函数里怎么调用这个mock,第一次调用返回1,第二次返回2,第三次返回3,完全符合你的需求。
补充说明:mock.fn()返回的对象的mock属性是用来查询调用记录的(比如myMock.mock.calls查看调用次数、参数等),不是用来设置实现逻辑的,所以之前的写法根本没把实现绑定到模拟函数上,自然无效。
内容的提问来源于stack exchange,提问作者myol
相关产品推荐
相关产品推荐

