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

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
}

测试脚本调整点

  1. Guest类测试的断言调整为传入执行函数:
expect(() => guest.createTask()).to.throw('method \'createTask\' is not defined');
expect(() => guest.changeType()).to.throw('method \'changeType\' is not defined');
  1. 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');
});
  1. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 10:36:00