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

问题描述 投票:0回答:2

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

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

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命令

我不是在cy中援引resetDb()

javascript cypress
2个回答
1
投票

赛普拉斯有承诺(Cypress.Promise),但他们并不是真正的承诺,更像是duck typing。实际上,赛普拉斯并不是真正的承诺100%兼容,它们可能会或可能不会起作用。

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

})

0
投票

你可以使用cy.wrap( promise ),虽然可能仍然有一个错误,它never times out(尚未测试)。

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.