使用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
相关产品推荐
相关产品推荐

