SpecFlow - шаг (заданный) с одним и тем же регулярным выражением в разных классах, не выполняющийся независимо - PullRequest
9 голосов
/ 28 марта 2011

У меня есть два класса (класс A и B), оба помечены [Binding].В настоящее время я использую класс для каждой функции.Классы A и B имеют шаг, который выглядит следующим образом:

   [Given(@"an employee (.*) (.*) is a (.*) at (.*)")]
   public void GivenAnEmployeeIsAAt(string firstName, string lastName, string role, string businessUnitName)

Когда я запускаю сценарий для функций, определенных в классе A, и тестовый исполнитель выполняет шаг, указанный выше, соответствующий шаг в классеВместо этого выполняется B.

Являются ли "Шаги" глобальными?Я думал, что только методы «ловушки» являются глобальными, то есть BeforeScenario, AfterScenario.Я не хочу такого поведения для «Дано», «Тогда» и «Когда».Есть ли способ это исправить?Я попытался поместить два класса в разные пространства имен, и это тоже не сработало.

Кроме того, я потенциально неправильно использую SpecFlow, желая, чтобы каждый "Given" был независимым, если я поместил их в отдельные классы?

1 Ответ

13 голосов
/ 28 марта 2011

Да Шаги (по умолчанию) глобальные.Таким образом, у вас возникнут проблемы, если вы определите два атрибута с RegExps, которые соответствуют одному и тому же шагу.Даже если они в отдельных классах.

Нахождение в отдельных классах или в другом месте (даже в другой сборке) не имеет никакого отношения к тому, как SpecFlow группирует его - это просто большой список данных Given, When и Then, которые он пытается сопоставить с Stepпротив.

Но есть функция Scoped Steps, которая решает эту проблему для вас.Проверьте это здесь: https://github.com/techtalk/SpecFlow/blob/master/Tests/FeatureTests/ScopedSteps/ScopedSteps.feature

Идея состоит в том, что вы добавляете другой атрибут (StepScope) к своему методу определения шага, и тогда он выполнит эту область видимости.Например, например:

[Given(@"I have a step definition that is scoped to tag (?:.*)")]
[StepScope(Tag = "mytag")] 
public void GivenIHaveAStepDefinitionThatIsScopedWithMyTag()
{
    stepTracker.StepExecuted("Given I have a step definition that is scoped to tag 'mytag'");
}

... или чтобы охватить весь класс определения шага одной функцией:

[Binding]
[StepScope(Feature = "turning on the light should make it bright")]
public class TurningOnTheLightSteps
{
    // ...
}

В этом определении шага для тега используется StepScope.Вы можете настроить свои шаги следующим образом:

  • Tag
  • Заголовок сценария
  • Заголовок элемента

Отличный вопрос!До сих пор я не до конца понял, для чего это;)

...