我正在用柏树编写一个测试,检查是否已将新项目添加到列表中。我不想对长度进行硬编码,我想确认列表的大小增加了一个。此代码有效:
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 柏树警告:柏树检测到您 在测试中返回了一个承诺,但也调用了一个或多个 cy 命令 在那个承诺的里面。
测试标题是:
评论快乐路径评论
虽然这在实践中有效,但它通常表明 反模式。你几乎不需要回报承诺和 调用 cy 命令。
如何修复此警告?
从测试中删除async/await
。柏树命令不是承诺,尽管行为类似于承诺。在此处阅读更多内容。
此外,您不能分配或使用任何 Cypress 命令的返回值。命令排队并异步运行。命令真正返回的是可链接的,换句话说,它是一种队列对象,它使用所需的值进行解析。在此处阅读更多内容。
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