Определение шагов во внешних файлах в Behat - PullRequest
8 голосов
/ 11 сентября 2011

Behat по умолчанию ищет определения шагов в файле с именем FeatureContext (все шаги в одном файле).
Имея много шагов, трудно поддерживать такой большой файл.

Я хотел бы иметь один файл определения для каждого файла объектов.

Как получить определения шагов во внешних файлах?

, например

homepage.feature
HomepageContext extends FeatureContext

Ответы [ 3 ]

25 голосов
/ 11 сентября 2011

Behat имеет несколько опций для вас, чтобы разделить ваш FeatureContext на несколько классов.Во-первых, вы можете использовать наследство старой школы php5.Если наследование не то, что вам нужно, Behat также поддерживает подконтексты: " Использование подконтекстов ".

Далее, если вы хотите назвать свой класс не так, как FeatureContext, вы можете переопределить этов разделе Context Configuration вашего файла конфигурации behat.yml.

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

Но ваш вопрос также спрашивает:

Я хотел бы иметь один файл определения для каждого файла объектов.

Этот запроссовершенно неправильно.Behat and Scenario BDD - это описание поведения вашего приложения в бизнес-терминах и создание тестового словаря для описанного поведения.Помня об этом, вы не можете иметь несколько разных словарей для одного набора функций.Записывая определения шагов, вы говорите Behat, что означает Given I am on "/news".И если вы хотите, чтобы этот шаг означал разные вещи от функции к функции - вы делаете это неправильно.

Behat состоит из 2 основных и достаточно отдельных концепций:

  1. *.featureфайлы, написанные на корнишоне.Эти файлы должны быть информативными.Означает, что они должны предоставить всю информацию для читателя, чтобы понять их.Gherkin - это не новый язык программирования для ваших функциональных тестов, это просто markdown для ваших пользовательских историй!
  2. FeatureContext.php классы, описывающие, как Behat должен тестировать ваши функции.Он определяет словарь для всего приложения, который будет использоваться со всем набором функций приложения.Это программный мост между вашими markdown -подобными пользовательскими историями и реальными функциональными тестами.

И вам не следует все портить.В одном наборе функций должен быть словарь с одним шагом (определения)Но вы можете использовать один словарь в более чем одном наборе функций благодаря наследованию и подконтекстам.И да, вы можете разбить один словарь на несколько классов php; -)

6 голосов
/ 12 сентября 2011

Использовать наследование классов и отдельные контексты.

# /features/contexts/
AbstractContext extends BehatContext {}
FeaturenameContext extends AbstractContext {}

Затем в /feature/FeatureContext.php импортировать файлы контекста:

/**
 * Initializes context.
 * Every scenario gets it's own context object.
 *
 * @param array $parameters context parameters (set up via behat.yml)
 */
public function __construct(array $parameters) {

    // import all context classes from context directory, except the abstract one

    $filesToSkip = array('AbstractContext.php');

    $path = dirname(__FILE__) . '/../contexts/';
    $it = new RecursiveDirectoryIterator($path);
    /** @var $file  SplFileInfo */
    foreach ($it as $file) {
        if (!$file->isDir()) {
           $name = $file->getFilename();
           if (!in_array($name, $filesToSkip)) {
               $class = pathinfo($name, PATHINFO_FILENAME);
               require_once dirname(__FILE__) . '/../context/' . $name;
               $this->useContext($class, new $class($parameters));
           }
        }
    }
}
0 голосов
/ 17 июля 2014

Одним из решений является горизонтальное повторное использование с субконтекстами. Используйте подконтекст для каждой «группы объектов».

class FeatureContext extends BehatContext
{

    public function __construct(array $context_parameters)
    {
        $this->useContext('math_context', new MathContext());
        $this->useContext('bash_context', new BashContext());
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...