JS基于Class实现三类角色功能Mocha测试报错修复方案求助
问题原因
- 禁止调用的方法未实现:未给Guest、User定义要求禁止的方法,访问对应方法时返回undefined,不是可执行函数,导致
to.throw断言失败 - Admin类型转换逻辑错误:
- 方法定义了多余参数,与测试调用时仅传索引的方式不匹配
- 类型判断误用赋值运算符
=,未使用instanceof判断实例实际类型 - 两个独立
if分支逻辑冲突,会把刚转换为User的实例又转回Guest
- 测试脚本语法错误:User类getTask用例的
expect多传了无关数字参数,导致断言逻辑异常;to.throw断言需要传入执行函数才能触发方法抛出的错误,原测试写法无法触发错误
修复后的业务代码
class Task { constructor(name) { this.name = name; } } class Guest { constructor(tasks) { this.tasks = tasks; } getTask(index) { return this.tasks[index]; } createTask() { throw new Error('method \'createTask\' is not defined'); } changeType() { throw new Error('method \'changeType\' is not defined'); } } class User { constructor(tasks) { this.tasks = tasks; } getTask(index) { return this.tasks[index]; } createTask(task) { return this.tasks.push(task); } changeType() { throw new Error('method \'changeType\' is not defined'); } } class Admin { constructor(userGuestArray) { this.userGuestArray = userGuestArray; } getArray() { return this.userGuestArray; } changeType(index) { const target = this.userGuestArray[index]; if (target instanceof Guest) { this.userGuestArray[index] = new User(target.tasks); } else if (target instanceof User) { this.userGuestArray[index] = new Guest(target.tasks); } return this.userGuestArray; } } module.exports = { Task, Guest, User, Admin }
测试脚本调整点
- Guest类测试的断言调整为传入执行函数:
expect(() => guest.createTask()).to.throw('method \'createTask\' is not defined'); expect(() => guest.changeType()).to.throw('method \'changeType\' is not defined');
- User类getTask用例去掉多余的数字参数:
it('should have method getTask', () => { expect(user.getTask(0).name).to.equal('task name 1'); expect(user.getTask(2).name).to.equal('task name 3'); });
- User类changeType用例修正实例化对象和断言写法:
it('should not implement method changeType', () => { const user = new User([]); expect(() => user.changeType()).to.throw('method \'changeType\' is not defined'); });
调整完成后重新执行测试命令即可通过所有用例。
内容的提问来源于stack exchange,提问作者NerdyStudent
相关产品推荐
相关产品推荐

