Определения шага по умолчанию - PullRequest
6 голосов
/ 07 февраля 2011

Я начинаю в мире SpecFlow и столкнулся с моей первой проблемой. С точки зрения сохранения моего кода СУХОГО, я хотел бы сделать следующее:

Есть два сценария:

Given I am on a product page<br> And myfield equals todays date<br> Then...

Given I am on a product page<br> And myfield equals todays date plus 4 days<br> Then...

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

[Given(@"myfield equals todays date(?: (plus|minus) (\d+) days)?")]<br> public void MyfieldEqualsTodaysDate(string direction, int? days)<br> {<br> //do stuff<br> }

Однако я продолжаю получать исключения, когда SpecFlow пытается проанализировать int? пары. Я проверил регулярное выражение, и оно определенно анализирует сценарий, как и ожидалось. Я знаю, что мог бы сделать что-то такое же грубое, как перегрузка методов и т. Д., Мне просто было интересно, поддерживает ли SpecFlow идею значений параметров по умолчанию или действительно другой способ достижения того же эффекта.

Большое спасибо

Ответы [ 4 ]

8 голосов
/ 26 февраля 2011

Значения по умолчанию не поддерживаются (пока), но для вашего конкретного случая я могу предложить следующее:

SpecFlow поддерживает создание «шаговых преобразований аргументов». С их помощью вы можете создавать методы, которые могут анализировать дату и время из разных шаблонов:

[StepArgumentTransformation("todays date")]
public DateTime TransformToday()
{
  return DateTime.Today;
}
[StepArgumentTransformation("todays date (plus|minus) (\d+) days")]
public DateTime TransformOtherDay(string direction, int days)
{
  //...
}

После этого вам просто нужно использовать параметр DateTime в своих шагах, а все остальное делает SpecFlow ...

[Given(@"myfield equals (.*)")]
public void MyfieldEqualsTodaysDate(DateTime date)
{
  //do stuff
}

вы можете увидеть больше примеров на https://github.com/techtalk/SpecFlow/wiki/Step-Argument-Conversions

2 голосов
/ 07 февраля 2011

Ваши шаги кажутся сформулированными на языке, довольно ориентированном на разработчика.

Что произойдет, если вы вместо этого сформулируете их на языке заинтересованных сторон?

Given I am on the product page
And my product is due for delivery today

Given I am on the product page
And my product is due for delivery in 4 days

Given I am on the product page
And my product was due for delivery 3 days ago

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

[Given(@"my product is due for delivery today")]
public void GivenTheProductIsDueToday() {
    var dueDate = Date.Today;
    DoOtherStuffWith(dueDate);
}

[Given(@"my product is due for delivery in (.*) days")]
public void GivenTheProductIsDueIn(int days) {
    var dueDate = Date.Today.AddDays(days);
    DoOtherStuffWith(dueDate);
}

[Given(@"my product was due for delivery (.*) days ago")]
public void GivenTheProductWasDue(int days) {
    var dueDate = Date.Today.AddDays(-1*days);
    DoOtherStuffWith(dueDate);
}

Я еще не использую SpecFlow, но надеюсь, что это имеет смысл.BDD больше фокусируется на том, чтобы вести диалог между бизнесом и заинтересованными сторонами, чем на тестировании или автоматизации.Компрометация этого для СУХОГО может быть бесполезной в долгосрочной перспективе.

2 голосов
/ 07 февраля 2011

Мой друг использует следующую технику

Given I am on a product page And myfield equals {TODAY}

Given I am on a product page And myfield equals {TODAY+4}

Затем вы можете разобрать специальную фразу в шаге defs

[Given(@"myfield equals ("SOME MATCHING REGEX")]<br> public void MyfieldEqualsTodaysDate(string date) {<br> //parse TODAY or you could use TOMORROW you get the idea<br> }

0 голосов
/ 07 февраля 2011

Лучшее, что мне удалось придумать, это следующее:
[Given(@"myfield equals todays date(?: ([\+-]\d+) days)?")]<br> public void MyfieldEqualsTodaysDate(string days)<br> {<br> int modifer = 0;<br> if(!String.IsNullOrEmpty(days))<br> {<br> modifer = Int32.Parse(days)<br> }<br> }
Что намного чище, чем мое первоначальное предложение, но все же требует от меня проверки параметра вручную.Обратите внимание на строковый параметр в методе.ни Int, ни Int?работа в указанных выше сценариях.

...