2011-02-07 5 views
6

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

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

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

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

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

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

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

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

ответ

8

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

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

+0

Да, в конце концов я закончил использование StepArgumentTransformation для этого. благодаря –

2

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

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")]
public void MyfieldEqualsTodaysDate(string date) {
//parse TODAY or you could use TOMORROW you get the idea
}

+0

Мне нравится идея, чтобы добавить свои собственные выражения даты, чтобы положить вещи в бизнес-плане для общих сценариев (сегодня, завтра, в следующем месяце, и т.д.) –

0

Лучшее, что я до сих пор нашел, следующее:
[Given(@"myfield equals todays date(?: ([\+-]\d+) days)?")]
public void MyfieldEqualsTodaysDate(string days)
{
int modifer = 0;
if(!String.IsNullOrEmpty(days))
{
modifer = Int32.Parse(days)
}
}

Это намного чище, чем мое первоначальное предложение, но все же требует от меня вручную проверить параметр. Обратите внимание на параметр string в методе. ни Int, ни Int? работать в указанных выше сценариях.

2

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

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

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 уделяет разговорам между бизнесом и заинтересованными сторонами, а не тестированию или автоматизации. Компромисс в том, что для СУШКИ может оказаться нецелесообразным в долгосрочной перспективе.

+0

почему «GivenTheProductIsDueToday (строка даты) "имеет дату, прошедшую в вообще? –

+0

Упс! Нет причин, кроме моей человеческой ошибки. – Lunivore

+0

Очень согласился. +1 – Stimul8d

Смежные вопросы