You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 07:25:14