Как заставить кошмар принудительно прекратить - PullRequest
0 голосов
/ 26 апреля 2018

Как видно из заголовка, я пытаюсь принудительно установить время ожидания сценария, особенно если условие (которое возвращает done()) не выполняется.

Вот некоторый код:

import * as Nightmare from "nightmare";

describe("Login Page", function() {
  this.timeout("30s");

  let nightmare = null;
  beforeEach(() => {
    nightmare = new Nightmare({ show: true });
  });

  let pageUrl;

  describe("give correct details", () => {
    it("should log-in, check for current page url", done => {
      nightmare
        .goto(www.example.com/log-in)
        .wait(5000)
        .type(".input[type='email']", "username")
        .type(".input[type='password']", "password")
        .click(".submit")
        .wait(3000)
        .url()
        .exists(".navbar")
        .then(function(result) {
          if (result) {
            done();
          } else {
            console.log("failure");
                // I want it to timeout here
          }
        })
        .catch(done);
    })
        .end()
        .then(url => {
          pageUrl = url;
          console.log(pageUrl);
        })
  });
});

Если в моем коде есть другие ошибки, не стесняйтесь, дайте мне знать.

1 Ответ

0 голосов
/ 26 апреля 2018

Вы можете использовать Promise.race() для реализации тайм-аута.Я не знаю ваш тестовый код, поэтому я покажу только внутреннюю часть, которая дает вам тайм-аут по запросу кошмара, и вы можете вставить его в свою тестовую среду.

// utility function that returns a rejected promise after a timeout time
function timeout(t, msg) {
    return new Promise(function(resolve, reject) {
        setTimeout(function() {
            reject(new Error(msg));
        }, t);
    });
}

Promise.race([
    nightmare
        .goto(www.example.com / log - in )
        .wait(5000)
        .type(".input[type='email']", "username")
        .type(".input[type='password']", "password")
        .click(".submit")
        .wait(3000)
        .url()
        .exists(".navbar")
        .end()
    , timeout(5000, "nightmare timeout")
]).then(result => {
    // process successful result here
}).catch(err => {
    // process error here (could be either nightmare error or timeout error)
});

Суть в том, чтовы создаете гонку между обещанием из вашего кошмарного запроса и обещанием из таймаута.В зависимости от того, что разрешено или отклонено, выигрывает первый и заканчивает обработку обещания.Если обработчик Promise.race(...).then() срабатывает, то это потому, что ваш кошмарный запрос закончился до истечения времени ожидания.Если обработчик Promise.race(...).catch() срабатывает, то это потому, что либо запрос кошмара не выполнен, либо вы превысили тайм-аут.Вы можете узнать, что это, посмотрев на объект ошибки, полученный с помощью отклонения.

Обратите внимание, что в кошмар также встроены всевозможные опции тайм-аута, как описано в документе здесь .Вы также можете найти один из этих встроенных вариантов, независимо от точной цели вашего тайм-аута.

...