Дополнительные параметры с Specflow

Как мне лучше всего справиться с тем фактом, что многие из моих шагов должны принимать 0, 1 или даже 2 даты в качестве «первых параметров»? Например, как мне лучше всего сделать поддержку необязательных аргументов в Specflow

Самый простой случай, когда даты не имеют значения, пока шаги происходят друг за другом

 Given Peter was born 23-06-1973
 And Peter created an account
 And Peter deposited $200

Однако часто многие шаги зависят от времени, например

 Given Peter was born 23-06-1973
 And at 1-4-2012 Peter created an account
 And at 13-4-2012 Peter deposited $200

В других случаях есть две даты, такие как дата в реальном времени и дата, когда что-то произошло. Например. Петр заполнил распечатанную форму 14-4-2012 на денежный перевод, но форма потерялась на несколько дней, и нам нужно сегодня зафиксировать, что форма была заполнена несколько дней назад.

 Given Peter was born 23-06-1973
 ...
 And at 16-4-2012 really at 14-4-2012 Completed a transfer form to transfer $100 to account 12345 

person Carlo V. Dango    schedule 23.04.2012    source источник


Ответы (3)


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

[Given(@"(at ([0-9-]+) (really at ([0-9-]+) |)|)(\w+) Completed a transfer form to transfer \$(\d+) to account (\d+)"]
public void TransferStep(string dummy1, DateTime? atDate, string dummy2, DateTime? reallyAtDate, string name, decimal amount, int account)
person mancaus    schedule 02.05.2012

Две вещи приходят мне в голову:

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

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

Моим первым ударом по второму решению было наложение атрибутов друг на друга для одного и того же метода. Это работает, но не для необязательных параметров. (И необязательные параметры не очень хорошо работают со ссылочными типами, такими как DateTime, но DateTime? nullable работает). Если вы сделаете такие шаги, вы получите такую ​​​​ошибку:

Несоответствие количества параметров! Метод привязки «Class1.MyGiven (Int32, Int32, Int32)» должен иметь 1 параметр.

Поэтому я возвращаюсь к своему первому решению следующим образом:

    [Given(@"case one with one int '(\d+)'")]
    public void Case1(int a)
    {
        // Short but sweet step definition that calls into automation layer
    }

    [Given(@"case one with two ints '(\d+)' and '(\d+)'")]
    public void Case2(int a, int b)
    {
        // Short but sweet step definition that calls into automation layer
    }

    [Given(@"case one with three ints '(\d+)' and '(\d+)' and also '(\d+)'")]
    public void Case3(int a, int b , int c)
    {
        // Short but sweet step definition that calls into automation layer
    }

Надеюсь, я не вызвал слишком много путаницы, идя вперед и назад. Извините - в автобусе не было готовой IDE :)

person Marcus Hammarberg    schedule 24.04.2012
comment
Я надеялся на что-то, где необязательные даты были реорганизованы, поскольку они будут применяться к большинству правил... - person Carlo V. Dango; 24.04.2012
comment
Не следил за вами там ... Что значит рефакторинг? - person Marcus Hammarberg; 24.04.2012
comment
Скажем, у вас есть 100 шагов, с вашим подходом мне нужно определить 300 шагов.. скорее, я надеялся, что часть шагов можно будет отнести к какому-то аргументу substring-parser - person Carlo V. Dango; 24.04.2012
comment
Аааа - хорошая мысль. Возможно, вы могли бы использовать StepArgumentTransformation - проверьте это; github.com/techtalk/SpecFlow/wiki/Step-Argument-Conversions - если вы используете это творчески, вы можете сократить все эти методы до дроби. - person Marcus Hammarberg; 24.04.2012
comment
Да, я знал об этом, но как использовать его с 0,1 или 2 аргументами... поэтому я и написал здесь :) - person Carlo V. Dango; 24.04.2012

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

Было бы здорово, если бы specflow поддерживал необязательные параметры, например. string searchTerm = "" но сейчас это не так.

[When(@"I request a list of managers")]
public void WhenIRequestAListOfManagers()
{
    WhenIRequestAListOfManagers("");
}

[When(@"I request a list of managers with the search term (.*)")]
public void WhenIRequestAListOfManagers(string searchTerm)
{
   //do stuff
}
person Alex KeySmith    schedule 01.04.2014
comment
Я только что протестировал его, и SpecFlow 2.4 поддерживает необязательные параметры. - person DdW; 01.02.2019
comment
Полезно знать, что @DdW не стесняйтесь создавать новый ответ и ссылаться на него отсюда, чтобы люди знали, используют ли они более новую версию. - person Alex KeySmith; 01.02.2019
comment
Ваш ответ действительно содержит то, что я бы опубликовал, честь ваша, сэр. - person DdW; 01.02.2019
comment
Слишком добрый сэр, слишком добрый :-) - person Alex KeySmith; 01.02.2019