Мне нужно определить мета-шаг как I have an item in my order cart
, Но вместо создания определения этого шага в классе Context я хочу просто использовать существующие шаги в некотором файле объектов. Потому что у меня уже есть сценарий для тестирования функции Adding item to order cart
,
Есть ли какое-либо существующее решение? Я думаю, что это очень популярный вариант использования и должен иметь лучшее решение, чем определение мета-шага в классе Context.
Короткий ответ: Нет.
Я знаю, что это может выглядеть как очень полезная функция, но она довольно быстро откусит вас назад, вызывая ненужные зависимости между шагами / сценариями, что приводит к хрупким тестам.
Решение состоит в том, чтобы рассматривать ваши контекстные файлы как мост между файлами компонентов и кодом 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!
}
Кроме того, на практике добавление товара в корзину может выглядеть несколько иначе в зависимости от того, что мы тестируем.
Если вы работаете над «Добавление в корзинуПо сценарию, вы, вероятно, захотите пройти через процесс посещения страницы и добавления товаров в корзину.
Если, однако, вы работаете над «Просмотр мини-корзины в шапке«Сценарий, вы можете использовать ярлыки, чтобы сделать ваш набор тестов немного быстрее.Учитывая, что у меня есть товар в корзине«, вы можете просто поместить элемент непосредственно в базу данных / сеанс / что бы там ни было. Вы можете себе позволить этот вид ярлыка, так как вы рассмотрели добавление элементов в корзину в других сценариях.
Кстати, если вы автоматизируете тесты для веб-приложений, вы найдете такие шаблоны, как объекты страницы очень полезно.
Одним из решений было бы взять сценарий и преобразовать его в мета-шаги в контекстной функции, а затем заменить этот сценарий просто новым шагом. Затем, когда вы хотите использовать это как часть другого сценария, он уже доступен как шаг.
FWIW, Everzet (создатель Behat) недавно выступил против мета-шагов, поскольку их действительно трудно поддерживать. Более поддерживаемым вариантом является использование базовых функций PHP для шагов вместо вызова их через мета-шаги. Однако, горе тому, кто смешивает мета-шаги с вызовами функций! Лучше всего заранее решить, по какому пути вы пойдете.