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

Javascript 在执行测试之前,等待自己的函数(返回承诺),javascript,cypress,Javascript,Cypress,我是cypress的新手,正在努力弄清楚事情是如何运作的 我有自己的函数(调用测试控制器服务器来重置数据库)。它返回一个承诺,该承诺在成功重置数据库时完成 function resetDatabase(){ // returns a promise for my REST api call. } 我的目标是能够在所有测试之前执行它 describe('Account test suite', function () { // how can I call resetDb here a

我是cypress的新手,正在努力弄清楚事情是如何运作的

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

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检测到您在测试中返回了一个承诺,但也调用了该承诺中的一个或多个cy命令

我没有在
resetDb()

中调用
cy
,但它们不是真正的承诺,更像是。事实上,Cypress并不是100%符合真正的承诺,它们可能有效,也可能无效

把Cypress.Promise看作一项任务或一项行动。它们与所有其他cypress命令一起顺序执行

要将函数放入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()
执行该命令

您可以使用
cy.wrap(promise)
,尽管它可能还存在一个bug(尚未测试)

否则,您可以使用
cy.then()
(它没有文档记录,将来可能会中断,而且我不会通过推广内部API来帮任何忙):

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


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

据我所知,应该有一个
wait
方法,您可以直接等待api,但是我可能错了,请注意,使用
wrap
方法,您应该能够包装ES6承诺并将其转换为Cypresspromise@quirimmo等待从上一个命令中获取超时或
别名
describe('Account', function () {
  before(() => {
    cy.resetDb();
  });

  it('can login', function () {
    // test code
  });

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