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

使用chakram时,before()中用.then导致状态断言报错的问题

解决Chakram测试中before()使用.then导致的TypeError问题

你的问题核心出在before块里对Promise的赋值和返回处理上,我来帮你拆解问题并给出修复方案:

问题根源

你原来的代码中,banana = chakram.request(...).then(...)这一行把banana赋值成了then()方法返回的新Promise,而不是Chakram请求本身返回的原始Promise。Chakram的expect方法需要接收它自己的请求Promise才能正确解析响应对象,而then()返回的Promise并没有Chakram需要的response属性,这就导致了TypeError: Cannot read property 'response' of undefined报错。另外,代码里的banana和test没有提前声明,可能会产生全局变量的隐患,建议用let提前声明。

修复后的代码

使用.then的正确写法

describe('create group', function() {
  let banana; // 提前声明请求Promise变量
  let test;    // 提前声明存储响应体的变量

  before('test', function() {
    // 先把Chakram请求的原始Promise赋值给banana
    banana = chakram.request("POST", `${url}`, {headers, body});
    // 在then里处理响应体,同时返回这个Promise确保before块等待请求完成
    return banana.then(function (response) {
      test = response.body;
    });
  })

  it("should return a 201 status when creating groups", function () {
    console.log(test);
    // 传入原始的Chakram请求Promise,才能正确解析响应状态
    return expect(banana).to.have.status(201);
  })
})

更简洁的async/await写法

如果你的测试环境支持ES6+,用async/await能让代码更易读,避免Promise链的嵌套问题:

describe('create group', function() {
  let banana;
  let test;

  before('test', async function() {
    banana = chakram.request("POST", `${url}`, {headers, body});
    // 等待请求完成,直接获取响应对象
    const response = await banana;
    test = response.body;
  })

  it("should return a 201 status when creating groups", function () {
    console.log(test);
    return expect(banana).to.have.status(201);
  })
})

额外注意点

  • 一定要保证before块返回Promise,这样Mocha(Chakram依赖的测试框架)才会等待请求完成后再执行it块,避免测试跑在请求完成之前。
  • 不要覆盖Chakram请求的原始Promise,expect需要依赖它来获取响应的元数据(比如状态码、请求头等)。

内容的提问来源于stack exchange,提问作者ultima-forsan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:32:02