我是柏树的新手,正在尝试弄清事物的工作原理。
我有自己的功能(该功能调用测试控制器服务器来重置数据库)。它会返回一个诺言,该诺言将在成功重置数据库后完成。
function resetDatabase(){
// returns a promise for my REST api call.
}
我的目标是能够在所有测试之前执行它。
describe('Account test suite', function () {
// how can I call resetDb here and wait for the result
// before the tests below are invoked?
it('can log in', function () {
cy.visit(Cypress.config().testServerUrl + '/Account/Login/')
cy.get('[name="UserName"]').type("admin");
cy.get('[name="Password"]').type("123456");
cy.get('#login-button').click();
});
// .. and more test
})
我如何在柏树中做到这一点?
更新
我尝试过
before(() => {
return resetDb(Cypress.config().apiServerUrl);
});
但随后我得到警告:
Cypress检测到您在测试中返回了一个Promise,但是还调用了该Promise中的一个或多个cy命令
我没有在cy
中调用resetDb()
。
答案 0 :(得分:1)
赛普拉斯有诺言(Cypress.Promise),但不是真正的诺言,更像duck typing。实际上,赛普拉斯并不完全符合真实的承诺,它们可能会或可能不会起作用。
将Cypress.Promise
视为任务或动作。它们与所有其他cypress命令顺序执行。
要使功能进入赛普拉斯管道,可以使用custom commands。该文档没有说明,但是您可以从中返回Cypress.Promise
。
Cypress.Commands.add('resetDb', function () {
var apiServerUrl = Cypress.config().apiServerUrl;
return new Cypress.Promise((resolve, reject) => {
httpRequest('PUT', apiServerUrl + "/api/test/reset/")
.then(function (data) {
resolve();
})
.catch(function (err) {
reject(err);
});
});
});
然后可以从测试本身执行该命令,或者像我在before()
中那样执行该命令。
describe('Account', function () {
before(() => {
cy.resetDb();
});
it('can login', function () {
// test code
});
})
答案 1 :(得分:0)
您可以使用cy.wrap( promise )
,尽管它可能仍存在never times out(尚未测试)的错误。
否则,您可以使用cy.then()
(未记录,将来可能会中断,而且我不赞成通过开发内部API来帮忙)
cy.then(() => {
return myAsyncFunction();
});
您可以在规范的顶层使用这两个命令,就像使用任何命令一样,它将被放入cypress命令队列并按顺序执行。
但是与cy.wrap
(IIRC)不同,cy.then()
支持传递回调,这意味着您可以在执行cy命令时在 时执行异步功能,而不是在规范开始时(因为传递给cy命令的表达式会立即求值)---这就是我在上面的示例中所做的。