我正在cypress中编写一个测试,检查是否有新项目添加到列表中。我不想对长度进行硬编码,我想确认列表的大小增加了一个。这段代码有效:
beforeEach(() => {
cy.visit('/page/1');
});
it('happy path comments', async function() {
cy.get('[data-cy=commentList]').should('have.length', 1);
const list = await cy.get('[data-cy=commentList] [data-cy=comment]');
const beforeLength = list.length;
cy.get('[data-cy=commentBody]').type('foobar');
cy.get('[data-cy=submit]').click();
cy.get('.[data-cy=commentList] [data-cy=comment]').should(
'have.length',
beforeLength + 1
);
cy.get('[data-cy=commentBody]').should('have.value', '');
});
但是,这会产生以下警告:
cypress_runner.js:84852赛普拉斯警告:赛普拉斯检测到您 在测试中返回了Promise,但还调用了一个或多个cy命令 兑现了诺言。
测试标题为:
评论快乐路径评论
尽管这在实践中可行,但通常表明 反模式。您几乎永远都不需要同时兑现承诺和承诺 调用cy命令。
如何解决此警告?
答案 0 :(得分:1)
从测试中删除async/await
。赛普拉斯的命令不是承诺,尽管其行为类似于承诺。阅读更多here。
此外,您不能分配或使用任何赛普拉斯命令的返回值。命令已排队并异步运行。命令真正返回的是可链接的,换句话说,它是一种队列对象,它以所需的值解析。了解更多here。
答案 1 :(得分:-1)
您可以将 Promise
与 await 关键字一起使用。并在 w3schools 上查找更多信息:https://www.w3schools.com/js/js_promise.asp
// {bidderCreationRequest} was declared earlier
function createBidderObject() {
const bidderJson = {};
await new Promise((generateBidderObject) => {
cy.request(bidderCreationRequest).then(async (bidderCreationResp) => {
bidderJson.id = bidderDMCreationResp.body.id;
generateBidderObject(bidderJson);
});
});
return bidderJson.id
}
createBidderObject(); // returns the id of the recently created bidder instead of undefined/null