因此,基于赛普拉斯请求文档:https : //docs.cypress.io/api/commands/request.html
看来我应该能够很轻松地发送带有JSON正文的POST请求。所以这就是我尝试的:
cy.fixture('test_create').as('create_test')
cy.request({
method: 'POST',
url: 'http://localhost:8080/widgets',
body: '@create_test',
headers: {
'Authorization': this.token,
'Content-Type': 'application/json;charset=UTF-8'
}
})
但是,当我查看赛普拉斯发送的“命令”时,它实际上是按原样发送正文 Body: @create_test
在POST请求的正文中不能使用固定装置吗?我确认固定装置已正确加载。我确认当我将整个JSON粘贴到body
选项中时它也可以工作....但是,使用大型JSON正文时,这确实非常难看。
您会得到一个文字,因为在形式上cy.request(options)
,options是一个普通的JS对象,不幸的是,赛普拉斯没有对其进行解析以解释该别名。
该请求表单cy.request(method, url, body)
可能确实为body参数提供了别名,因为cy.route()
它允许引用:访问灯具数据
例如,以下内容应有效,但不允许设置标题
cy.fixture('test_create').as('create_test')
cy.request('POST', 'http://localhost:8080/widgets', '@create_test');
因此,您可以使用 then()
cy.fixture('test_create').then(myFixture => {
cy.request({
method: 'POST',
url: 'http://localhost:8080/widgets',
body: myFixture,
headers: {
'Authorization': this.token,
'Content-Type': 'application/json;charset=UTF-8'
}
})
});
要么
cy.fixture('test_create').as('create_test');
... // some other code between
cy.get('@create_test').then(myFixture => { // retrieve the fixture from alias
cy.request({
method: 'POST',
url: 'http://localhost:8080/widgets',
body: myFixture,
headers: {
'Authorization': this.token,
'Content-Type': 'application/json;charset=UTF-8'
}
})
})
我最终不得不使用
then()
另一件事cy.fixture()
是异步的。因此,我的想法是使用this.fixturename
可能尚未被“阅读”。因此,通过使用then()
我确保在夹具完成加载后才执行请求。我注意到在发布后您已经有了答案的评论,但是对于其他人来说,查看一些显式代码很有用。
至于灯具是异步的,我想知道这是否正确?我知道
cy.fixture()
这是“从fixtures文件夹中读取此文件”的简写,它不必异步完成。请注意,那时.then()
看起来像是一个承诺,但并不是真的-它只是使您可以访问上一个命令结果。像
this.fixturename
这样使用局部变量确实可以工作,但是会变得棘手,因为this
可以根据使用function
样式it()
还是箭头函数而改变,因此我个人更喜欢使用then()
。