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
相关产品推荐
相关产品推荐

