在执行测试之前等待自己的函数(返回一个承诺)



我是柏树的新手,正试图弄清楚事情是如何运作的。

我有自己的函数(调用测试控制器服务器来重置数据库(。它返回一个承诺,当数据库成功重置时完成。

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);
});

但随后我收到警告说:

赛普拉斯检测到您在测试中返回了一个承诺,但也在该承诺中调用了一个或多个 cy 命令

我不是在resetDb()中调用cy.

Cypress有 promise(Cypress.Promise(,但它们不是真正的 promise,更像是鸭子打字。事实上,赛普拉斯与真正的承诺并不是100%兼容的,它们可能会或可能不会奏效。

Cypress.Promise视为任务或操作。它们与所有其他柏树命令一起按顺序执行。

若要将函数放入 Cypress 管道,可以使用自定义命令。文档没有说明,但您可以从它们返回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
});
})

您可以使用cy.wrap( promise ),尽管可能仍然存在永远不会超时的错误(尚未测试(。

否则,您可以使用cy.then()(这是未记录的,将来可能会中断,而且我不会通过推广内部 API 来做任何好处(:

cy.then(() => {
return myAsyncFunction();
});

您可以在规范的顶层使用这两个命令,就像使用任何命令一样,它将被排队进入 cypress 命令队列并按顺序执行。

但与cy.wrap(IIRC(不同的是,cy.then()支持传递回调,这意味着您可以在执行cy命令执行异步函数,而不是在规范开始时执行(因为传递给cy命令的表达式会立即评估(---这就是我在上面的例子中所做的。

最新更新