Повторное использование кода между двумя разными моделями в Cucumber
У меня есть 2 модели: статья и категория. Статья зависит от категории: чтобы создать статью, сначала нужно создать категорию. И у меня есть 4 файла: article.features, category.features, article_steps.rb, category_steps.rb
, Где-то в article_steps.rb
Я должен создать категорию, чтобы создать саму статью. Но код для создания категории уже был определен в category_steps.rb
,
Как я могу использовать его в article_steps.rb
? Я мог бы сделать это в рамках одной модели, но есть ли способ сделать это в разных моделях?
1 ответ
Шаги, определенные в category_steps.rb
может быть использован в любом файле функций. Просто используйте Given
шаги, определенные в category_steps.rb
в article.features
:
article.features
Feature: Articles
In order to ...
As a ...
I want to ...
Background:
Given the "Test" Category exists
Scenario: Creating an Article
When I create an Article with the following attributes:
| Title | Body |
| Just Testing | Test test |
And the "Just Testing" Article is in the "Test" Category
Then an Article should exist with the following attributes:
| Title | Body |
| Just Testing | Test test |
And the "Just Testing" Article should be in the "Test" Category
Поскольку категория "Тест" будет использоваться во всех сценариях, перенесите создание этих данных в сценарий. Background
, Далее, в ваших файлах определения шагов, определите шаги выше:
category_steps.rb
Given /^the "(.*?)" Category exists$/ do |category_name|
Category.create! :name => category_name
end
article_steps.rb
When /^I create an Article with the following attributes:$/ do |table|
article = Article.new
# Loop over the rows and columns to set properties on article
article.save!
end
When /^the "(.*?)" Article is in the "(.*?)" Category$/ do |article_title, category_name|
article = Article.find_by_title article_title
article.category = Category.find_by_name category_name
article.save!
end
Then /^an Article should exist with the following attributes:$/ do |table|
expected = Article.new
# Loop over rows and columns of table to set properties on article
actual = Article.find_by_title expected.article_title
# Compare expected and actual for differences
expect(expected.title).to eq actual.title
expect(expected.body).to eq actual.body
end
Then /^the "(.*?)" Article should be in the "(.*?)" Category$/ do |article_title, category_name|
article = Article.find_by_title article_title
expect(article.category.name).to eq category_name
end
Вся идея определения шагов заключается в том, чтобы способствовать повторному использованию кода между несколькими сценариями и файлами компонентов. Определения шагов не должны быть привязаны к файлу объектов. Скорее, они должны быть достаточно общими, чтобы их можно было использовать в разных ситуациях.