2014-09-16 3 views
4

Мне нужно определить мета-шаг, как I have an item in my order cart. Но вместо того, чтобы создавать определение для этого шага в классе Context, я хочу просто использовать существующие шаги в каком-либо файле функций. Потому что у меня уже есть сценарий для тестирования функции Adding item to order cart.Могу ли я использовать один из сценариев в качестве мета-шага вместо определения его в классе контекста?

Есть ли существующее решение? Я думаю, что это очень популярный вариант использования и должен иметь лучшее решение, чем определение мета-шага в классе Context.

ответ

4

Короткий ответ: No.

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

Решение состоит в том, чтобы обрабатывать ваши файлы контекста как мост между файлами функций и кодом php. Это означает, что методы контекстного файла являются короткими и делегируют большую часть работы другим объектам. Таким образом, нет никакого дублирования между контекстами, вы просто вызываете другие объекты:

/** 
* @Given I open the product page 
*/ 
public function iOpenTheProductPage() 
{ 
    $this->productPage->open(); 
} 

/** 
* @Given I add a :product to the cart 
*/ 
public function iAddProductToTheCart($product) 
{ 
    $this->productPage->addToCart($product); 
} 

/** 
* @Given I have an item in the cart 
*/ 
public function iHaveAnItemInTheCart() 
{ 
    // reuse 
    $this->productPage->open(); 
    $this->productPage->addProduct('Behat t-shirt'); 

    // ... or put the items directly to the db! 
} 

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

Если вы работаете над сценарием «« Добавить в корзину », вы, вероятно, захотите пройти процесс посещения страницы и добавить товары в корзину.

Если вы работаете над сценарием «« Просмотр мини-корзины в заголовке », вы можете воспользоваться ярлыками, чтобы сделать ваш тестовый пакет немного быстрее. В givens, когда вы говорите «Учитывая, что у меня есть товар в корзине», вы можете просто поместить элемент непосредственно в базу данных/сеанс/что-то там. Вы можете позволить себе такой ярлык, так как вы добавили предметы в корзину в других сценариях.

Кстати, если вы автоматизируете тесты для веб-приложений, вы найдете такие шаблоны, как page objects.

1

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

FWIW, Everzet (создатель Бехата) в последнее время выступил против мета-шагов, поскольку их действительно трудно поддерживать. Более удобная опция заключается в том, чтобы использовать базовые функции PHP для этих шагов, вместо того, чтобы называть их мета-шагами. Однако, много горе тому, кто смешивает мета-шаги с вызовами функций! Лучше всего решить, на каком пути вы собираетесь отправиться.