получение параметра, заканчивающегося перед определенной строкой в ​​cucumber-js - PullRequest
0 голосов
/ 24 мая 2018

Я попытался установить это регулярное выражение для аутентификации. Данный шаг с двумя необязательными параметрами:

Given(/^I log in as ([A-Za-z\-]+)(?: with the contract ((?:.(?!for the protal))+))?(?: for the protal (.*))?$/, 
  function(user, contract, portal, callback) { 
    console.log({user, contract, portal}); 
  }
);

Cucumber-js не может обнаружить второй необязательный параметр, даже если он успешно сопоставляет выражения с данным предложением содин, два или три параметра.Я помещаю .(?!for the protal) во второй параметр, чтобы завершить его, когда третий (портал) в конце концов начинается, поскольку список контрактов не является исчерпывающим.

Вот вывод, который я получаю для трех случаев:

Given I log in as tester1

пользователь: tester1,

контракт: не определено,

портал: не определено

OK

Given I log in as tester1 with the contract contract1

пользователь: tester1,

контракт: не определено,

портал: не определено

KO

Given I log in as tester1 with the contract contract1 for the protal portal1

пользователь: tester1,

контракт: portal1,

portal: undefined

KO

Я думаю, что существует проблема с обнаружением этой частиregex. (?! для protal) в cucumber-js, так как точно такое же выражение работает в Java.Кроме того, Cucumber в Java успешно устанавливает второй параметр как неопределенный, когда упоминаются только первый и третий (но это еще одна проблема).

Спасибо!

Ответы [ 2 ]

0 голосов
/ 29 мая 2018

Существует ошибка в cucumber-js по этой проблеме: https://github.com/cucumber/cucumber-js/issues/1096

Я временно решил ее, заключив контракт в кавычки, используя это выражение:

/^I log in as ([\w-]+)(?: with the contract "([^"]+)")?(?: for the portal (.+))?$/
0 голосов
/ 25 мая 2018

Вам нужно будет сделать 3 версии этого шага, одну с контрактом, одну с контрактом и порталом и одну без них.

Given(/^I log in as ([\w-]+)$/,(user)=>{
   // log in
});

Given(/^I log in as ([\w-]+) with the contract ([\w-]+)$/, (user, contract) => {
  // log in with contract
});

Given(/^I log in as ([\w-]+) with the contract ([\w-]+) for portal ([\w-]+)$/, (user, contract, portal)=>{
  // log in with contract for portal
});

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

В вашем определении шага, несомненно, есть несколько условных операторов, которые зависят от параметров, которые проходят.Почему бы не упростить его, определив их как разные (но похожие) шаги?

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

function logIn(user, contract = null, portal = null){
   // do your single step stuff here
}

Given(/^I log in as ([\w-]+)$/,(user)=>{
   return logIn(user);
});

Given(/^I log in as ([\w-]+) with the contract ([\w-]+)$/, (user, contract) => {
  return logIn(user, contract);
});

Given(/^I log in as ([\w-]+) with the contract ([\w-]+) for portal ([\w-]+)$/, (user, contract, portal)=>{
  return logIn(user, contract, portal);
});
...