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

如何用Jasmine测试自定义TypeScript函数?测试遇阻求助

如何正确测试自定义普通函数

你遇到的问题核心是误用了Jasmine的间谍匹配器,以及对普通函数的测试逻辑理解有点偏差,咱们一步步理清楚:

错误原因解析

toHaveBeenCalled()这个匹配器是专门用来验证**间谍函数(Spy)**是否被调用的,但你现在直接执行了getKeyValueOfAttributesFromElement(mockData),得到的是这个函数的返回值(一个对象),不是间谍,所以才会报错expected a Spy, but got ({ undefined: undefined })。

另外,你尝试用new调用这个函数也不对——这是个普通工具函数,不是构造函数(没有用class定义,也没有在内部用this做实例属性),所以不能用new关键字调用。

正确的测试方式:验证输入输出

测试普通函数的核心,就是验证它在给定输入时,是否返回符合预期的输出。针对你的函数,我们可以这样写测试:

import { getKeyValueOfAttributesFromElement } from './dom';

describe('getKeyValueOfAttributesFromElement', () => {
  let mockElement;

  beforeEach(() => {
    // 注意:你的mock数据要更贴近真实DOM元素的attributes结构
    // 真实的Element.attributes是NamedNodeMap,Object.keys遍历它会拿到数字索引,而不是属性名
    // 所以调整mock数据更符合真实场景:
    mockElement = {
      attributes: {
        0: { nodeName: 'a', value: 'somestring' },
        1: { nodeName: 'b', value: '42' },
        2: { nodeName: 'c', value: 'false' },
        length: 3 // 模拟NamedNodeMap的length属性
      }
    };
  });

  it('should return a key-value map of element attributes', () => {
    // 调用函数,拿到返回结果
    const result = getKeyValueOfAttributesFromElement(mockElement);
    
    // 断言结果符合预期
    expect(result).toEqual({
      a: 'somestring',
      b: '42',
      c: 'false'
    });
  });
});

额外补充:什么时候用Spy?

如果你的函数是被其他代码调用的(比如在某个组件或服务里被调用),你想验证它是否被正确调用过,这时候才需要创建Spy:

// 比如在测试某个组件时,想验证它是否调用了这个函数
import * as DomUtils from './dom';

describe('SomeComponent', () => {
  it('should call getKeyValueOfAttributesFromElement when mounted', () => {
    // 创建函数的Spy
    const spy = spyOn(DomUtils, 'getKeyValueOfAttributesFromElement').and.returnValue({});
    
    // 触发组件挂载等操作...
    
    // 验证Spy是否被调用
    expect(spy).toHaveBeenCalled();
  });
});

但如果只是测试函数本身的逻辑,完全不需要Spy,直接测试输入输出就足够了——这才是单元测试函数的核心:确保它做了你期望它做的事情。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:30:21