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

Jest中afterEach未清空totalScore导致网球计分测试用例失败问题

问题排查结果

核心错误点

  • 你误以为是resetGame没生效,但实际上beforeEach每次都会创建全新的Tennis实例,两个测试用例的tennis对象完全独立,第一个用例的执行结果根本不会影响第二个用例,报错和afterEach的重置逻辑完全无关,afterEach本身属于冗余代码可以直接删除。
  • 真正的问题出在getScore方法的逻辑错误:你对totalScore始终用的是追加赋值(+=),而不是每次调用时重新计算赋值:
    1. 当第一个玩家得1分时,方法先追加Fifteen love,之后又无条件追加Love all,最终拼接结果就是你得到的Fifteen loveLove all
    2. 就算没有触发条件分支,也会无条件追加Love all,完全不符合计分规则。
修复方案

1. 修正Tennis类逻辑

推荐直接让getScore返回计算后的分数,不要用属性累加存储,代码更简洁:

class Tennis {
  constructor() {
    this.firstPlayerScoreTimes = 0;
  }
  getScore() {
    if (this.firstPlayerScoreTimes === 1) {
      return "Fifteen love";
    }
    return "Love all";
  }

  firstPlayerScore() {
    this.firstPlayerScoreTimes++;
  }
}

module.exports = Tennis;

如果你一定要保留totalScore属性,也可以改成每次调用先清空再赋值:

getScore() {
  this.totalScore = "";
  if (this.firstPlayerScoreTimes === 1) {
    this.totalScore = "Fifteen love";
  } else {
    this.totalScore = "Love all";
  }
}

2. 同步修正测试断言逻辑

如果改成getScore直接返回分数,测试里的scoreShouldBe可以改成更合理的写法:

const scoreShouldBe = (expected) => {
  expect(tennis.getScore()).toBe(expected);
};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 13:54:04