Повторное использование кода между двумя разными моделями в 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

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

Другие вопросы по тегам