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

