Перед выполнением тестов дождитесь собственной функции (которая возвращает обещание) - PullRequest
0 голосов
/ 03 сентября 2018

Я новичок в 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 внутри этого обещания

Я не вызываю cy в resetDb().

Ответы [ 2 ]

0 голосов
/ 04 сентября 2018

Вы можете использовать cy.wrap( promise ), хотя все еще может быть ошибка, из-за которой никогда не прерывается (еще не проверял).

В противном случае, вы можете использовать cy.then() (что недокументировано, может сломаться в будущем, и я не буду оказывать никаких услуг, продвигая внутренние API):

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

Вы можете использовать обе эти команды на верхнем уровне спецификации, как если бы вы использовали любую команду, и она будет помещена в очередь команд Cypress и выполнена по порядку.

Но в отличие от cy.wrap (IIRC), cy.then() поддерживает передачу обратного вызова, что означает, что вы можете выполнить асинхронную функцию во время выполняемой команды cy, а не в начале spec (потому что выражения, передаваемые командам cy, оцениваются сразу) --- это то, что я делаю в примере выше.

0 голосов
/ 03 сентября 2018

Cypress имеют обещания ( Cypress.Promise ), но они не являются реальными обещаниями, больше похожи на duck typing . Фактически, 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);
      });
  });
});

Затем эту команду можно выполнить из самого теста или, как в моем случае из before().

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

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

})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...