jasmine-node中mock方法的.and为何未定义?如何配置返回值?
报错原因、差异说明及解决方案
错误原因
你碰到的TypeError: Cannot read properties of undefined (reading 'returnValue')源于两个问题:
- 你不必要地重新赋值了
jasmine.createSpyObj生成的shutdown方法——该方法已经是Jasmine创建好的Spy对象,无需再用jasmine.createSpy()重新定义。 - jasmine-node 3.0.0基于Jasmine 2.x版本,虽然支持
and.returnValue()语法,但错误的重新赋值操作导致Spy对象的and属性未正确初始化,最终抛出undefined错误。
jasmine-node与Jasmine Core的差异
jasmine-node是Jasmine Core的命令行封装工具,其Spy对象的核心API与对应版本的Jasmine Core完全一致。但jasmine-node 3.0.0对应Jasmine 2.x系列,和新版Jasmine 3+存在以下细节差异:
- Spy配置的链式调用容错性更低,部分未正确初始化的Spy操作会直接抛出错误。
- 部分高级Spy特性(如
callFake的嵌套用法)在2.x中写法更严格。
正确配置Mock返回值的写法
方式1:直接配置createSpyObj生成的Spy
无需重新赋值,直接对已生成的Spy设置返回值:
describe("CRUD operations", function () { it("completes successfully", () => { const mockDao = jasmine.createSpyObj('ProductDao', ['shutdown']); // 直接对已存在的spy设置返回值 mockDao.shutdown.and.returnValue(1); }); });
方式2:单独创建Spy后赋值(动态添加方法场景)
如果需要为对象动态添加Spy方法,分步骤设置避免链式调用的初始化问题:
describe("CRUD operations", function () { it("completes successfully", () => { const mockDao = {}; const shutdownSpy = jasmine.createSpy('shutdown'); shutdownSpy.and.returnValue(1); mockDao.shutdown = shutdownSpy; }); });
补充
你之前用mockDao.shutdown = () => 1的临时方案会丢失Jasmine Spy的核心功能(如调用次数统计、参数记录等),使用上述写法可以完整保留这些测试能力。
内容的提问来源于stack exchange,提问作者Mike Woinoski
相关产品推荐
相关产品推荐

