как вызвать внешнюю асинхронную функцию ожидания в testcafe - PullRequest
0 голосов
/ 19 декабря 2018

У меня есть helper.js, который имеет функцию

async function getLink() {
  try {
    const message = await authorize(content);
    const link = message.match(/href=\"(.*?)\"/i);
    return link[1];
  }
  catch(error) {
    console.log('Error loading:',+error);
    throw(error);
  }
}
module.exports.getLink = getLink;

Я хочу использовать эту функцию внутри скрипта testcafe после выполнения теста

В test.spec.js

import { Selector } from 'testcafe';
let link = '';
fixture My fixture
.page `https://devexpress.github.io/testcafe/example/`;

 test('test1', async t => {

// do something with clientWidth
});
test('test2', async t => {
  // use the getLink function here from the helper.js to get the string value
  mailer.getLink().then(res=>{
    link = res;
  })
  t.navigateTo(link)
});

Как решить эту проблему?

Я пытался использовать clientFunction, но получаю ошибку, как _ref is not defined код выглядит следующим образом

const validationLink = ClientFunction(() => {
  return getLink();
}, { dependencies: { getLink } });
let link = await validationLink();

Ответы [ 2 ]

0 голосов
/ 20 декабря 2018

Если метод getLink должен читать что-то в DOM (что выходит за рамки Selector) или должен вычислять что-то особенное в браузере, вы должны создать clientFunction, как показано ниже (со всемикод (без импортированного кода) внутри clientFunction):

const getLink = ClientFunction((selector) => {
    return new Promise( (resolve) => {
        const element = selector();
        // check, in developper tools, what are the available properties in element
        console.log("element:", element);
        // code omitted for brevity that reads data from element and does special computation from it
        // build the result to be returned
        const result = 'the computed link';
        resolve(result);
    });
});

test('test2', async t => {
  const linkSelector = Selector('css selector');
  const link = await getLink(inputSelector);
  await t.navigateTo(link);
});

Если для метода getLink не нужно читать что-то особенное из DOM, то создавать clientFunction не нужно.Вам просто нужно создать вспомогательный метод и импортировать его (как предложено @AlexSkorkin):

test('test2', async t => {
  const link = await mailer.getLink();
  await t.navigateTo(link)
});

Обратите внимание, что t.navigate () должен ожидаться и mailer.getLink ().

0 голосов
/ 19 декабря 2018

Поскольку функция async / await не работает внутри clientFunction. В качестве обходного пути я переместил тест в отдельный файл и переместил функцию getLink () за пределы теста

, если вы хотите запустить эти два файла.один за другим добавьте сценарии в package.json как «testcafe chrome file1.js && testcafe chrome file2.js»

Любые прямые ответы приветствуются

...