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

