如何为游戏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); });
关键细节说明
- 固定随机初始值:直接覆盖
enemy.bounceTick为固定值,确保每次测试的初始状态完全一致,避免随机数导致测试结果不稳定 - 记录初始y坐标:敌人的移动是基于当前y值叠加正弦偏移量,只有对比初始和最终的y值,才能验证移动逻辑的正确性
- 正确计算预期值:别忘了
update()方法第一行会执行this.bounceTick += .02;,所以计算正弦值时要用初始bounceTick + 0.02,而不是初始的2 - 处理浮点数精度:正弦计算会产生浮点数,不同环境下可能有微小精度差异,用近似断言能避免这类无意义的测试失败
内容的提问来源于stack exchange,提问作者MMM
相关产品推荐
相关产品推荐

