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

Frisby.js提取addUser/deleteUser复用函数失效问题求助

解决Frisby.js复用add/deleteUser函数失效的问题

你遇到的问题主要源于两个关键错误,咱们一步步拆解修复:

1. 错误的函数传递方式

你在beforeEach和afterEach里写的addUser()和delete()是立即执行函数,而不是把函数本身作为回调传递给测试钩子。Mocha(Frisby基于Mocha)的测试钩子需要接收函数引用,这样它才能在测试周期的正确时机触发这个异步函数。

正确的写法是去掉括号,直接传递函数名:

beforeEach(addUser)
// 错误写法:beforeEach(addUser())

2. 保留关键字冲突

delete是JavaScript的保留关键字,不能用来命名变量或函数,这会直接导致语法错误,代码根本无法正常解析。把函数名改成合法的名称,比如deleteUser。

修复后的完整代码

// 修正函数定义,确保作用域内可访问所需变量
const addUser = function(done) {
    frisby
        .post(adduser_endpoint, newuser_payload)
        .expect('status', 200)
        .done(done)
}

// 替换保留关键字delete为合法名称deleteUser
const deleteUser = function(done) {
    frisby
        .del(del_user_endpoint)
        .expect('status', 200)
        .done(done)
}

describe('Successfully change password', function () {
    // 传递函数引用,而非立即执行
    beforeEach(addUser)
    
    it('Enter valid Password to set password', function (done) {
        frisby
            .post(reset_password_endpoint, change_password_payload)
            .expect('status', 200)
            .done(done)
    })
    
    // 使用修正后的函数名传递引用
    afterEach(deleteUser)
})

额外优化提示

  • 如果需要动态传递用户参数(比如不同测试用例用不同用户数据),可以给复用函数加参数,再用匿名函数包装传递:
    const addUser = function(userPayload, done) {
        frisby
            .post(adduser_endpoint, userPayload)
            .expect('status', 200)
            .done(done)
    }
    
    // 在测试钩子中包装传参
    beforeEach(function(done) {
        addUser(customUserPayload, done)
    })
    
  • 如果删除用户需要用到创建后的用户ID,可以把用户信息存在测试上下文里(注意不要用箭头函数,箭头函数没有独立的this):
    const addUser = function(done) {
        frisby
            .post(adduser_endpoint, newuser_payload)
            .expect('status', 200)
            .then((res) => {
                // 假设响应返回用户ID
                this.createdUserId = res.json.id
            })
            .done(done)
    }
    
    const deleteUser = function(done) {
        frisby
            .del(`${del_user_endpoint}/${this.createdUserId}`)
            .expect('status', 200)
            .done(done)
    }
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:13:03