@ngneat/spectator 6.1.1测试指令时input值为空,求正确测试方式
解决@ngneat/spectator 6.1.1测试自定义数字指令时input.value为空的问题
我来帮你排查这个问题,你遇到的情况在spectator早期版本里挺常见的,尤其是处理type="number"的输入框时。先拆解几个关键问题:
问题根源分析
toHaveExactText的误用:这个匹配器是用来检查元素的文本内容(比如<div>文本</div>里的内容),而input的value是属性值,应该用toEqual来断言。typeInElement的行为限制:在spectator 6.x版本中,typeInElement对于type="number"的输入框,可能不会像预期那样直接设置value,或者没有正确触发指令依赖的事件(比如input或keydown),导致你的指令没有处理输入内容。- 指令的事件监听逻辑:如果你的
appNumbersOnly指令是监听keydown或input事件来过滤输入,那模拟输入时需要确保这些事件被正确触发。
修正后的测试代码
试试下面的写法,直接设置value并触发事件,同时修正断言方式:
it('should allow all numbers', () => { spectator = createDirective('<input appNumbersOnly type="number">'); const input = spectator.query('input') as HTMLInputElement; // 直接设置value并触发input事件,确保指令处理逻辑生效 input.value = '1234'; spectator.dispatchEvent(input, 'input'); // 用toEqual断言value属性,而非文本内容匹配器 expect(input.value).toEqual('1234'); });
额外调试建议
- 先临时去掉
appNumbersOnly指令测试基础输入逻辑,确认spectator能正常读取input的value,以此排查是spectator环境问题还是指令本身的逻辑问题。 - 检查你的
appNumbersOnly指令实现,确保它在input事件触发时正确更新输入框的value,而不是只拦截按键动作却没有同步处理最终的value值。
内容的提问来源于stack exchange,提问作者Gargoyle
相关产品推荐
相关产品推荐

