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

如何为游戏Enemy类的update方法编写JavaScript测试?

如何正确测试敌人的移动逻辑?

首先,咱们先拆解你当前测试代码里的几个问题,这也是导致AssertionError: expected NaN to equal undefined的核心原因:

  • assert.equal()需要两个参数:实际值和期望值,你只传了一个参数,导致断言逻辑异常
  • 你直接给this.bounceTick赋值,但这里的this并不指向enemy实例,应该直接操作enemy对象的属性
  • 没有记录update前的y坐标,无法验证移动后的位置变化是否符合预期

接下来,我给你整理一个可靠的测试方案,核心思路是固定随机值、记录初始状态、对比预期结果:

完整测试代码示例

it("moves position correctly", function() {
  // 1. 创建enemy实例(请确保game、bulletLayer等依赖已正确初始化)
  const enemy = new Enemy(game, 100, 200, bulletLayer, 0);
  
  // 2. 固定bounceTick的初始值,消除Math.random()的随机性影响
  enemy.bounceTick = 2;
  // 3. 记录update前的初始y坐标
  const initialY = enemy.y;
  
  // 4. 调用待测试的update方法
  enemy.update();
  
  // 5. 计算预期的y值:初始y + Math.sin(更新后的bounceTick) * 1
  // 注意:update里会先给bounceTick加0.02,所以要用初始值+0.02来计算正弦值
  const expectedY = initialY + Math.sin(2 + 0.02) * 1;
  
  // 6. 断言实际y值与预期值一致
  // 若测试框架支持近似断言(如Chai的closeTo),更推荐用它规避浮点数精度误差
  assert.equal(enemy.y, expectedY);
  // 替代方案:assert.closeTo(enemy.y, expectedY, 0.001);
});

关键细节说明

  1. 固定随机初始值:直接覆盖enemy.bounceTick为固定值,确保每次测试的初始状态完全一致,避免随机数导致测试结果不稳定
  2. 记录初始y坐标:敌人的移动是基于当前y值叠加正弦偏移量,只有对比初始和最终的y值,才能验证移动逻辑的正确性
  3. 正确计算预期值:别忘了update()方法第一行会执行this.bounceTick += .02;,所以计算正弦值时要用初始bounceTick + 0.02,而不是初始的2
  4. 处理浮点数精度:正弦计算会产生浮点数,不同环境下可能有微小精度差异,用近似断言能避免这类无意义的测试失败

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:40:36