Javascript 如何在cypress测试中调用fetch?

Javascript 如何在cypress测试中调用fetch?,javascript,cypress,Javascript,Cypress,我正在使用。我有一个小React应用程序和一个小烧瓶后端。我想让我的测试调用后端来设置它将要运行的状态。我过去常去拿。这个很好用。除了塞浦路斯是疯了,不认为测试成功。我不是一个javascript开发人员,所以这可能是显而易见的,但我不知道如何让它快乐 这是我的测试代码: it.only(“编辑作业”,异步()=>{ const now=new Date().getTime() const title=`编辑此-${now}` const newTitle=`SUCCESS-EDIT-${now

我正在使用。我有一个小React应用程序和一个小烧瓶后端。我想让我的测试调用后端来设置它将要运行的状态。我过去常去拿。这个很好用。除了塞浦路斯是疯了,不认为测试成功。我不是一个javascript开发人员,所以这可能是显而易见的,但我不知道如何让它快乐

这是我的测试代码:

it.only(“编辑作业”,异步()=>{
const now=new Date().getTime()
const title=`编辑此-${now}`
const newTitle=`SUCCESS-EDIT-${now}`
const company=`Edit company-${now}`
常量链接=`https://example.com/edit-me-${now}`
const status=“编辑测试”
const body=JSON.stringify({company,title,link,status})
等待获取('/add_job',{method:'post',headers:{'Content-Type':'application/json'},body:body})
访问(”http://localhost:3000/jobs_list")
cy.contains(标题)
cy.contains(公司)
cy.contains(链接)
cy.contains(状态)
cy.get(`[name=edit-${title}`)。单击()
cy.get(`[value=${title}`).clear().type(newTitle)
cy.get(`[name=save-${newTitle}`)。单击()
cy.contains(新标题)
log(“该死的”)
})
这似乎很好。但最后,有一个柏树错误:

Cypress command timeout of 4530ms exceeded. (and Mocha's done() called multiple times)
我也试着不使用async/await,在获取后将步骤放入
然后
中,但这没有帮助。将
done
传递到it块,并在最后调用
done()
使其不运行任何操作。这是有意义的,因为cypress步骤看起来是同步的,但实际上不是,因此它会命中
done>()
,然后再执行其中任何一项

使传递给
it
的函数不异步,并将fetch更改为

cy.request('POST','http://localhost:3000/add_job“,{'Content-Type':'application/json',公司,标题,链接,状态})
取而代之的是,fetch
似乎起了作用,但我想了解原因。

理解Cypress用于将命令链接在一起的机制非常重要。它代表您管理承诺链,每个命令都会产生下一个命令的“主题”,直到链结束或遇到错误。开发人员不需要直接使用承诺,而是需要理解他们的工作方式很有帮助!

您可以通过以下方式将项目添加到Cypress承诺链/队列:

您可能会将
fetch
调用包装为使用Cypress.Promise,但建议您使用
cy.request
,除非您有特定原因不使用它

//wrap null,这样您就可以使用`then`作为任意命令调用回调
//并返回一棵柏树。承诺-让柏树等待它的结果
//(或者只使用cy.request:)
cy.wrap(null)。然后(()=>{
返回新的Cypress.Promise((解决,拒绝)=>{
试一试{
获取(/*…*/)。然后(解析);
}捕获(e){
拒绝(e);
}
})
})

使用
cy.request
而不是
fetch


我想在这里添加ECMAScript async await和Promise spec refs的链接或指南。作者说他不熟悉JS,所以这对他有很大帮助。
cy.request({yourUri}).as("response"); // This takes care of the async task. 
 
cy.get("@response").should((response) => { 
   // Carry on with the rest of your test
   cy.get("some selector");

});