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

jga*_*fin 11 javascript cypress

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

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

function resetDatabase(){
  // returns a promise for my REST api call.
}
Run Code Online (Sandbox Code Playgroud)

我的目标是能够在所有测试之前执行它。

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

})
Run Code Online (Sandbox Code Playgroud)

我怎么能在柏树中做到这一点?

更新

我试过了

  before(() => {
    return resetDb(Cypress.config().apiServerUrl);
  });
Run Code Online (Sandbox Code Playgroud)

但是后来我收到一条警告说:

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

我不是cy在调用in resetDb()

jga*_*fin 9

赛普拉斯有承诺(Cypress.Promise),但它们不是真正的承诺,更像是鸭子打字。事实上,Cypress 并非 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);
      });
  });
});
Run Code Online (Sandbox Code Playgroud)

然后可以从测试本身执行该命令,或者在我的情况下从before().

describe('Account', function () {
  before(() => {
    cy.resetDb();
  });

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

})
Run Code Online (Sandbox Code Playgroud)