Двусмысленные определения шагов

У меня следующие два шага:

[When(@"I Schedule a Start Now Event named ""(.*)"" for the DR program named ""(.*)""")]

[When(@"I Schedule a Start Now Event named ""(.*)"" for the DR program named ""(.*)"" with load control device ""(.*)""")]

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

Это связано с тем, что, когда я закомментировал определение второго шага, мой шаг указывает на определение первого шага следующим образом:

When I Schedule a Start Now Event named "~@+Event" for the DR program named "~@=Program" with load control device "Light"

Семестр "~@=Program" with load control device "Light" предполагается как одно строковое значение. Но так не должно быть.

Следует связать с определением второго шага.

Это проблема с шаблонами Regex?

3 ответа

Решение

Похоже, мне нужно быть более конкретным:

[When(@"I Schedule a Start Now Event named ""([^""]*)"" for the DR program named ""([^""]*)""")]

[When(@"I Schedule a Start Now Event named ""([^""]*)"" for the DR program named ""([^""]*)"" with load control device ""([^""]*)""")]

Делая * неохотно, вероятно, будет делать то же самое:

[When(@"I Schedule a Start Now Event named ""(.*?)"" for the DR program named ""(.*?)""")]

[When(@"I Schedule a Start Now Event named ""(.*?)"" for the DR program named ""(.*?)"" with load control device ""(.*?)""")]

... но отрицательный класс персонажа более надежен. Отказ от ответственности: я сам не пользователь SpecFlow, но этот пост в блоге, кажется, подтверждает мои предположения.

Это проблема с регулярным выражением, но также довольно распространенная проблема.

В основном регулярное выражение .* известен как жадный. Он будет соответствовать всему, что может, от того, где он появляется, пока что-то не заставит его не совпадать. Предложение Алана Мура использовать кавычки будет работать очень хорошо. Другой - использовать имена, которые не содержат пробелов, тогда вы можете использовать [^ ]* смысл совпадения многих не пробелов.

Я бы на самом деле предположил, что вам, возможно, будет проще строить ваши запросы с помощью небольших заявлений. Например

Given a DR program called xxx
And a load control device xxx
When I schedule a Start now event named xxx

private string drProgramName;
private string loadControlDevice;

[Given("a DR program called (.*)"]
public void GivenADRProgramCalled(string name)
{
  drProgamName = name;
}

[Given("a load control device (.*)"]
public void GivenALoadControlDevice(string name)
{
  loadControlDevice = name;
}

[When("I schedule a start now event named (.*)")]
public void WhenIScheduleAStartNowEventNamed(string name)
{
  WhenIScheduleAStartNowEventNamed(name, drProgamName, loadControlDevice);
}

Этот пост действительно решил мою проблему. Ура алана!!

Другие вопросы по тегам