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

@ngneat/spectator 6.1.1测试指令时input值为空,求正确测试方式

解决@ngneat/spectator 6.1.1测试自定义数字指令时input.value为空的问题

我来帮你排查这个问题,你遇到的情况在spectator早期版本里挺常见的,尤其是处理type="number"的输入框时。先拆解几个关键问题:

问题根源分析

  1. toHaveExactText的误用:这个匹配器是用来检查元素的文本内容(比如<div>文本</div>里的内容),而input的value是属性值,应该用toEqual来断言。
  2. typeInElement的行为限制:在spectator 6.x版本中,typeInElement对于type="number"的输入框,可能不会像预期那样直接设置value,或者没有正确触发指令依赖的事件(比如input或keydown),导致你的指令没有处理输入内容。
  3. 指令的事件监听逻辑:如果你的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 07:31:49