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

Angular 16+NgRx下,如何用Jasmine测试TypeScript嵌套函数?

如何在Jasmine单元测试中调用函数内部的嵌套函数?

我正在使用Angular 16搭配NgRx框架,基于TypeScript开发,需要为以下代码编写Jasmine单元测试(.spec.ts),想知道怎么在测试类里调用其中的内部函数:

export function x1(p1: P1) {
  function xx1(
    tree: T<Code>[],
    code: T<Code>
  ): string | null {
    // 业务逻辑
    if(true){
      return "Message";
    } else {
      return null;
    }
  }
  return xx1;
}

我的测试类初始代码如下:

describe('P1', () => {
  const p1 = new P1();
  const validatorFn$ = x1(p1);

  it('should return true', () => {
    // 需要在这里调用内部方法
    

  });
});

解决方案

你不需要特殊技巧去访问内部的xx1函数,因为x1本身的设计就是返回这个内部函数作为闭包。你可以直接使用x1(p1)的返回值来调用xx1,具体修改后的测试代码如下:

describe('P1', () => {
  const p1 = new P1();
  // x1的返回值就是内部的xx1函数,直接赋值给变量(建议去掉$后缀,因为它不是Observable)
  const validatorFn = x1(p1);

  it('should return "Message" when condition is satisfied', () => {
    // 构造符合T<Code>类型要求的测试数据
    const testTree: T<Code>[] = []; // 根据实际业务结构填充测试用例数据
    const testCode: T<Code> = {}; // 同样填充对应测试数据

    // 直接调用validatorFn,本质就是调用内部的xx1函数
    const result = validatorFn(testTree, testCode);

    // 断言结果符合预期
    expect(result).toBe("Message");
  });

  it('should return null when condition fails', () => {
    // 构造触发else分支的测试数据
    const testTree: T<Code>[] = [];
    const testCode: T<Code> = {};

    const result = validatorFn(testTree, testCode);

    expect(result).toBeNull();
  });
});

补充说明

  • 因为xx1是x1的内部函数,且x1直接返回了它,所以x1(p1)的返回值就是xx1的引用,闭包已经捕获了p1的上下文,测试时只需要传入正确的tree和code参数即可。
  • 如果你的业务逻辑中xx1的分支判断依赖p1的状态,可以在测试前修改p1的属性值,来覆盖不同的逻辑分支。

内容的提问来源于stack exchange,提问作者uma

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 16:55:25