SpecFlow - упорядочение нескольких методов BeforeScenario

Я получаю ноги от влаги с помощью SpecFlow, и мне действительно нравится.

За исключением нескольких тернистых проблем... например, кода настройки функции и сценария.

В одном файле общего назначения под названием InfrastructureSteps.cs у меня есть общий код настройки, который должен запускаться для каждого сценария - поэтому мой метод выглядит примерно так:

[BeforeScenario]
public void SetupDbContext()
{
    // define some basic stuff, set up a database transaction context etc.
}

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

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

@needs_extra_setup
Scenario: .....
   Given .....
   When .....
   Then ......

и реализовал тестовый метод установки BeforeScenario:

[BeforeScenario("needs_extra_setup")]
public void DoExtraSetupForMyScenario()
{
   // do stuff
}

Он работает - он вызывается - но он называется до, метод общего назначения [BeforeScenario] получает вызов:-( и, следовательно, он не работает - материал, настраиваемый в этом способе настройки общего назначения отсутствует и приводит к сбою моего кода.

Итак, есть ли способ в SpecFlow заказать методы [BeforeScenario]? Или я могу указать конкретный метод [BeforeScenario], чтобы сначала выполнить "базовый" [BeforeScenario] метод, например, вызов базового метода в методе переопределения?

Конечно, я мог бы называть этот "базовый" [BeforeScenario] метод явно, но это похоже на подход с санным молотом.....

Любые идеи? Мысли? Указатели?

Ответ 1

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

Но вы могли бы использовать некоторые другие hooks, такие как BeforeFeature, и, возможно, обойти его таким образом.

Другим способом является просто иметь флаг, который проверяет, был ли общий материал установлен в конкретном материале, вызывая метод SetupDbContext (или предпочтительно то, что SetupDbContext вызывает по очереди).

Используйте словарь ScenarioContext.Current для хранения ваших флагов.

Надеюсь, вы нашли это полезным

Ответ 2

У меня была та же проблема. Я закончил тем, что использовал

if(ScenarioContext.Current.ScenarioInfo.Tags.Contains("needs_extra_setup"))

в конце метода [BeforeScenario]. Он описан на странице, уже связанной с Маркусом: SpecFlow Hooks

Ответ 3

Теперь это возможно в v2 specflow, который находится в бета-версии на момент написания.

Атрибуты привязки по шагам имеют необязательное свойство order, которое позволяет вам указать порядок перехватов. Сначала будут обрабатываться меньшие числа, а значение порядка по умолчанию - 10 000.