правильный способ выдать результат неудачи в слушателе события ответа страницы в codeceptJS - PullRequest
0 голосов
/ 16 ноября 2018

Я написал вспомогательные методы для добавления прослушивателя сетевых ответов поверх экземпляра страницы Puppeteer. код выглядит так

let Helper = codecept_helper;

class CheckHelper extends Helper {
  async listenRequest(listener)
  {
    const helper = this.helpers['Puppeteer'];
    await helper.page.setRequestInterception(true);
    helper.page.on("request",listener);
    return helper._waitForAction();
  }
  async listenResponse(listener)
  {
    const helper = this.helpers['Puppeteer'];
    helper.page.on("response",listener);
    return helper._waitForAction();
  }
}

module.exports = CheckHelper;

затем в тестовом скрипте

  let self=this;
  I.listenResponse((response)=>{
     if(response.url().match(/github.*\.js/) && response.headers()['content-length']>1000) {
         //codeceptjs.event.emit(codeceptjs.event.test.failed, self, 'js file is too big!');
         //codeceptjs.recorder.throw('js file is too big!')
         //codeceptjs.recorder.stop();
         //throw new Error('js file is too big!')
     }
  })
  I.amOnPage("https://www.github.com");

Сначала я добавляю прослушиватель ответов, затем я перехожу к "github", когда какой-то размер файла js слишком велик, я выкину ошибку, чтобы тоже проверить правильность размера контента.

однако, даже если я выкидываю ошибку (как это сделали коды комментариев), основной тестовый поток просто не останавливается, как мне поступить правильно?

1 Ответ

0 голосов
/ 16 ноября 2018

ну, я нашел решение позже

я записал весь ответ страницы в пользовательский объект в экземпляре страницы. позже я написал справочные методы для проверки целых записей.

//in helper.js
startRecordResponse() {
    const helper = this.helpers['Puppeteer'];
    helper.page.on("response", (res) => {
        //record all response instance into savedResponse object inside page, we'll use it later
        helper.page.savedResponse = helper.page.savedResponse || {};
        helper.page.savedResponse[res.url()] = res;
    });
    return helper._waitForAction();
}

checkFileIsTooBig(filter, sizeLimit) {
    const helper = this.helpers['Puppeteer'];
    //use the data recorded in savedResponse object 
    Object.keys(helper.page.savedResponse).forEach((url) => {
        var res = helper.page.savedResponse[url];
        if (((filter instanceof RegExp && filter.test(url)) || (typeof filter == "string" && url.indexOf(filter) != -1)) && res.headers()['content-length'] > sizeLimit) {
            throw new Error(`file ${url} is too big,${res.headers()['content-length']} > ${sizeLimit}`)
        }
    })
    return helper._waitForAction();
}

затем в тестовом файле

Before((I) => {
  I.startRecordResponse();
  I.amOnPage("https://www.github.com");
});

Scenario('github_test', (I) => {
        //check a js file contain github is less than 100 bytes
        I.checkFileIsTooBig(/github.*\.js/,100);
    }
);
...