2013-03-18 2 views
9

Возможно ли, что класс подконтекста расширяет другие функции подконтекста и переопределения?Можно ли переопределить определения шагов в контексте поведения?

В настоящее время у меня есть

class TestContext extends BehatContext { 
    /** 
    * @Given /^a testScenarioExists$/ 
    */ 
    public function aTestscenarioexists() { 
     echo "I am a generic test scenario\n"; 
    } 
} 

и

class SpecialTestContext extends TestContext { 
    /** 
    * @Given /^a testScenarioExists$/ 
    */ 
    public function aTestscenarioexists() { 
     echo "I am a special test scenario\n"; 
    } 
} 

В контексте художественного я говорю это нам, что SpecialTestContext как подконтекст.

Когда я запускаю тест behat жалуется

[Behat \ Behat \ Exception \ RedundantException]
Step "/^а testScenarioExists $ /" уже определено в SpecialTestContext :: aTestscenarioexists()

Может ли кто-нибудь указать мне правильное направление с этим?

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

Scenario: Test with generic environment 
Given I am in the environment "generic" 
    And a test scenario exists 

Scenario: Test with specialised environment 
Given I am in the environment "specialised" 
    And a test scenario exists 

Затем я могу добавить код FeatureContext, чтобы загрузить правильный субконтекст.

ответ

4

Короче ... это невозможно: http://docs.behat.org/guides/2.definitions.html#redundant-step-definitions

С точки зрения нагрузки подконтекстов динамически, это не представляется возможным:

  1. подконтекстов загружаются в «время компиляции» - то есть. не в главном FeatureContext конструктор
  2. К тому времени первое определение шаг выполняется, behat уже собраны все аннотации и сопоставляются их к шагу определения, больше не может/должен быть добавлен

Проверьте это, чтобы понять, как а Context ведет себя: http://docs.behat.org/guides/4.context.html#contexts-lifetime

Пара широких вещей, чтобы рассмотреть следующие вопросы:

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

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

  3. это до ваших, как вы организовать FeatureContexts, однако ваш будет хотеть сделать это по темам/доменов в вашей системе, например:

    • DatabaseContext может быть связано с чтением + запись на тест db
    • ApiContext может содержать шаги, связанные с проверки АНИ в вашей системе
    • CommandContext может быть связано с проверки вашей консоли системы команд
+0

Просто обновите приведенные выше ссылки. * http://docs.behat.org/en/latest/user_guide/context/definitions.html#redundant-step-definitions * http://docs.behat.org/en/latest/user_guide/context. html # contexts-lifetime – aczietlow

9

Как уже упоминалось Rob Сквайры, динамический контекст загрузки не будет работать.

Но у меня есть обходное решение для переопределения определений шагов, которые я использую регулярно. Не комментируйте свой метод. Behat выберет аннотацию переопределенного метода в суперклассе и сопоставит это имя метода с соответствующим шагом. Когда будет найден соответствующий шаг, будет вызван метод в вашем подклассе. Чтобы это было очевидно, я использовал для этого аннотацию @override. Аннотации @override не имеют особого значения для Behat.

class SpecialTestContext extends TestContext { 
    /** 
    * @override Given /^a testScenarioExists$/ 
    */ 
    public function aTestscenarioexists() { 
     echo "I am a special test scenario\n"; 
    } 
} 
+1

Это фактическое решение - переопределение методов в подклассе, без изменения шаблона docblock. –

0

Переписанный метод не может быть определен с тем же предложением.

class SpecialTestContext extends TestContext { 

    public function aTestscenarioexists() { 
    echo "I am a special test scenario\n"; 
    } 
} 
Смежные вопросы