Статьи

Простая интернационализация для вашего Rails-приложения с BDD, часть II

Создание местоположения.

В первой части мы создали приложение, в котором перечислены местоположения на английском и испанском языках.

В этой части мы создадим новое местоположение, показывающее проблемы локализации на этом пути. Помните, что мы используем Cucumber и BDD для запуска нашего приложения.

Давайте напишем сценарий о том, как мы это сделаем.

Scenario: Create a new location
Given I am on new location page
And I fill in «Name» with «Shiny location»
When I press «Create»
Then I should see «Shiny location»

Сценарий довольно короткий и не содержит подробностей реализации. В настоящее время, когда мы запускаем Cucumber, он запускает все сценарии. Нам действительно не нужно этого делать, поскольку мы сосредоточены только на Create a new location scenario « Create a new location scenario . К счастью, легко сказать Cucumber сосредоточиться только на сценариях «в процессе». Над новым сценарием добавьте тег @wip . (wip = работа в процессе)
Теперь это должно выглядеть так.

@wip
Scenario: Create a new location
Given I am on new location page
And I fill in «Name» with «Shiny location»
When I press «Create»
Then I should see «Shiny location»

Отлично, теперь мы можем запустить Cucumber и просто сосредоточиться на текущем сценарии.

$ cucumber —profile wip
Using the wip profile…
Feature: Manage locations
In order to manage locations
As a user
I want to create and edit my locations.
@wip
Scenario: Create a new location # features/manage_locations.feature:19
Given I am on new location page # features/manage_locations.feature:20
And I fill in «Name« with «Shiny location« # features/manage_locations.feature:21
When I press «Create« # features/manage_locations.feature:22
Then I should see «Shiny location« # features/step_definitions/location_steps.rb:9
1 scenario (1 undefined)
4 steps (1 skipped, 3 undefined)
0m0.465s
You can implement step definitions for undefined steps with these snippets:
Given /^I am on new location page$/ do
pending # express the regexp above with the code you wish you had
end
Given /^I fill in «([^«]*)« with «([^«]*)«$/ do |arg1, arg2|
pending # express the regexp above with the code you wish you had
end
When /^I press «([^«]*)«$/ do |arg1|
pending # express the regexp above with the code you wish you had
end
The —wip switch was used, so the failures are expected.

view raw
gistfile1.sh
hosted with ❤ by GitHub

ПРОВАЛ! Как и ожидалось, Cucumber говорит нам, что у нас есть неопределенные сценарии. Давайте отбросим этот сценарий и сделаем его зеленым.
Скопируйте определения шагов для неопределенных шагов в файл features / step_definitions / location_step.rb .

Given /^I am on new location page$/ do
pending # express the regexp above with the code you wish you had
end
Given /^I fill in «([^»]*)» with «([^»]*)»$/ do |arg1, arg2|
pending # express the regexp above with the code you wish you had
end
When /^I press «([^»]*)»$/ do |arg1|
pending # express the regexp above with the code you wish you had
end

view raw
gistfile1.rb
hosted with ❤ by GitHub

Начиная с определения первого шага, мы посещаем new_location_path .

Given /^I am on new location page$/ do
visit(new_locations_path)
end

view raw
gistfile1.txt
hosted with ❤ by GitHub

Запуск сценария теперь дает следующий результат.

$ cucumber —profile wip
Using the wip profile…
Feature: Manage locations
In order to manage locations
As a user
I want to create and edit my locations.
@wip
Scenario: Create a new location # features/manage_locations.feature:19
Given I am on new location page # features/step_definitions/location_steps.rb:22
undefined local variable or method `new_location_path for #<Cucumber::Rails::World:0x0000010332f330> (NameError)
./features/step_definitions/location_steps.rb:23:in `/^I am on new location page$/
features/manage_locations.feature:20:in `Given I am on new location page
And I fill in «Name» with «Shiny location» # features/step_definitions/location_steps.rb:26
When I press «Create» # features/step_definitions/location_steps.rb:30
Then I should see «Shiny location» # features/step_definitions/location_steps.rb:9
Failing Scenarios:
cucumber -p wip features/manage_locations.feature:19 # Scenario: Create a new location
1 scenario (1 failed)
4 steps (1 failed, 3 skipped)
0m0.771s
The —wip switch was used, so the failures were expected.

view raw
gistfile1.sh
hosted with ❤ by GitHub

«Не определенная локальная переменная или метод« new_location_path »?» Говорит нам, что нам нужно добавить маршрут. Откройте файл route.rb в папке / config и добавьте новый маршрут.

match ‘locations/new’ => ‘locations#new’, :as => :new_locations

view raw
gistfile1.rb
hosted with ❤ by GitHub

Что происходит, когда мы запускаем тест?

$ cucumber —profile wip
Using the wip profile…
Feature: Manage locations
In order to manage locations
As a user
I want to create and edit my locations.
@wip
Scenario: Create a new location # features/manage_locations.feature:19
Given I am on new location page # features/step_definitions/location_steps.rb:22
The action new could not be found for LocationsController (AbstractController::ActionNotFound)
./features/step_definitions/location_steps.rb:23:in `/^I am on new location page$/
features/manage_locations.feature:20:in `Given I am on new location page
And I fill in «Name« with «Shiny location« # features/step_definitions/location_steps.rb:26
When I press «Create» # features/step_definitions/location_steps.rb:30
Then I should see «Shiny location» # features/step_definitions/location_steps.rb:9
Failing Scenarios:
cucumber -p wip features/manage_locations.feature:19 # Scenario: Create a new location
1 scenario (1 failed)
4 steps (1 failed, 3 skipped)
0m0.527s
The —wip switch was used, so the failures were expected.

view raw
gistfile1.sh
hosted with ❤ by GitHub

Конечно, действие «новый» не может быть найдено для LocationsController. Cucumber помогает нам в создании нашего Rails-приложения. Давайте добавим это в файл location_controller.rb в папке / app / controllers.

# GET /locations/new
# GET /locations/new.json
def new
@location = Location.new
respond_to do |format|
format.html # new.html.erb
format.json { render json: @location }
end
end

view raw
gistfile1.rb
hosted with ❤ by GitHub

Хорошо, огурец, расскажи нам, что происходит сейчас …

$ cucumber —profile wip
Using the wip profile…
Feature: Manage locations
In order to manage locations
As a user
I want to create and edit my locations.
@wip
Scenario: Create a new location # features/manage_locations.feature:19
Given I am on new location page # features/step_definitions/location_steps.rb:22
Missing template locations/new, application/new with {:locale=>[:en], :formats=>[:html], :handlers=>[:erb, :builder, :coffee]}. Searched in:
* «/Users/john/Sites/zzz/app/views«
(ActionView::MissingTemplate)
/Users/john/.rvm/rubies/ruby-1.9.3-p0/lib/ruby/1.9.1/benchmark.rb:295:in `realtime
./app/controllers/locations_controller.rb:16:in `new
./features/step_definitions/location_steps.rb:23:in `/^I am on new location page$/
features/manage_locations.feature:20:in `Given I am on new location page
And I fill in «Name« with «Shiny location« # features/step_definitions/location_steps.rb:26
When I press «Create« # features/step_definitions/location_steps.rb:30
Then I should see «Shiny location« # features/step_definitions/location_steps.rb:9
Failing Scenarios:
cucumber -p wip features/manage_locations.feature:19 # Scenario: Create a new location
1 scenario (1 failed)
4 steps (1 failed, 3 skipped)
0m0.546s
The —wip switch was used, so the failures were expected.

view raw
gistfile1.sh
hosted with ❤ by GitHub

Еще один ожидаемый результат, нам нужно создать наш взгляд на действие. В папке / app / views / location создайте новый файл .html.erb. В этом мы создадим форму.

<%= form_for(@location) do |f| %>
<p>
<%= f.label :name %>
<%= f.text_field :name %>
</p>
<p>
<%= f.submit %>
</p>
<% end %>

view raw
gistfile1.rb
hosted with ❤ by GitHub

Если я знаю свои Rails и BDD, мы должны пройти через первый шаг.

$ cucumber —profile wip
Using the wip profile…
Feature: Manage locations
In order to manage locations
As a user
I want to create and edit my locations.
@wip
Scenario: Create a new location # features/manage_locations.feature:19
Given I am on new location page # features/step_definitions/location_steps.rb:22
And I fill in «Name« with «Shiny location« # features/step_definitions/location_steps.rb:26
TODO (Cucumber::Pending)
./features/step_definitions/location_steps.rb:27:in `/^I fill in «([^«]*)« with «([^«]*)«$/
features/manage_locations.feature:21:in `And I fill in «Name» with «Shiny location»
When I press «Create« # features/step_definitions/location_steps.rb:30
Then I should see «Shiny location« # features/step_definitions/location_steps.rb:9
1 scenario (1 pending)
4 steps (2 skipped, 1 pending, 1 passed)
0m0.662s
The —wip switch was used, so the failures were expected.

view raw
gistfile1.sh
hosted with ❤ by GitHub

Да, первый шаг проходит. Время сосредоточиться на втором шаге. Код для выполнения этого шага звучит так же, как имя шага (спасибо, Капибара!)

Given /^I fill in «([^»]*)» with «([^»]*)»$/ do |field, value|
fill_in(field, :with => value)
end

view raw
gistfile1.rb
hosted with ❤ by GitHub

Можете ли вы угадать, что Огурец скажет нам делать дальше?

$ cucumber —profile wip
Using the wip profile…
Feature: Manage locations
In order to manage locations
As a user
I want to create and edit my locations.
@wip
Scenario: Create a new location # features/manage_locations.feature:19
Given I am on new location page # features/step_definitions/location_steps.rb:22
And I fill in «Name« with «Shiny location« # features/step_definitions/location_steps.rb:26
When I press «Create« # features/step_definitions/location_steps.rb:30
TODO (Cucumber::Pending)
./features/step_definitions/location_steps.rb:31:in `/^press «([^«]*)«$/’
features/manage_locations.feature:22:in `When I press «Create«
Then I should see «Shiny location» # features/step_definitions/location_steps.rb:9
1 scenario (1 pending)
4 steps (1 skipped, 1 pending, 2 passed)
0m0.561s
The —wip switch was used, so the failures were expected. All is good.

view raw
gistfile1.sh
hosted with ❤ by GitHub

Теперь нам нужно нажать кнопку «Создать». Опять же, помощники Капибары — наш друг. В файле location_steps шаг «Когда я нажимаю» выглядит следующим образом:

When /^I press «([^»]*)»$/ do |button|
click_button(button)
end

view raw
gistfile1.rb
hosted with ❤ by GitHub

Давайте запустим тест.

$ cucumber —profile wip
Using the wip profile…
Feature: Manage locations
In order to manage locations
As a user
I want to create and edit my locations.
@wip
Scenario: Create a new location # features/manage_locations.feature:19
Given I am on new location page # features/step_definitions/location_steps.rb:22
And I fill in «Name« with «Shiny location« # features/step_definitions/location_steps.rb:26
When I press «Create« # features/step_definitions/location_steps.rb:30
Then I should see «Shiny location« # features/step_definitions/location_steps.rb:9
expected there to be content «Shiny location« in «Zzz\n\nLocations\n\n« (RSpec::Expectations::ExpectationNotMetError)
./features/step_definitions/location_steps.rb:11:in `/^(?:|I )should see «([^«]*)«$/’
features/manage_locations.feature:23:in `Then I should see «Shiny location«
Failing Scenarios:
cucumber -p wip features/manage_locations.feature:19 # Scenario: Create a new location
1 scenario (1 failed)
4 steps (1 failed, 3 passed)
0m0.612s
The —wip switch was used, so the failures were expected. All is good.

view raw
gistfile1.sh
hosted with ❤ by GitHub

Мы ожидали увидеть контент «Блестящее место» в «ИнтернационализацияnnLocationsnn». Давайте посмотрим на это внимательно.

Почему это собирается / места? Это должно идти в / location / create. Это должно быть проблемой маршрутизации, поэтому откройте файл rout.rb и в пределах локали и добавьте:

match «locations» => ‘locations#create’, :as => :locations, :via => [:post]

view raw
gistfile1.rb
hosted with ❤ by GitHub

Мы можем проверить, что наши маршруты выглядят правильно, используя rake routes :

$ rake routes
locations (/:locale)/locations(.:format) locations#index
new_locations (/:locale)/locations/new(.:format) locations#new
locations POST (/:locale)/locations(.:format) locations#create
root /(:locale)(.:format) locations#index

view raw
gistfile1.rb
hosted with ❤ by GitHub

Это выглядит правильно, поэтому давайте запустим сценарий.

$ cucumber —profile wip
Using the wip profile…
Feature: Manage locations
In order to manage locations
As a user
I want to create and edit my locations.
@wip
Scenario: Create a new location # features/manage_locations.feature:19
Given I am on new location page # features/step_definitions/location_steps.rb:22
And I fill in «Name« with «Shiny location« # features/step_definitions/location_steps.rb:26
When I press «Create« # features/step_definitions/location_steps.rb:30
Then I should see «Shiny location« # features/step_definitions/location_steps.rb:9
expected there to be content «Shiny location« in «Zzz\n\nLocations\n\n« (RSpec::Expectations::ExpectationNotMetError)
./features/step_definitions/location_steps.rb:11:in `/^(?:|I )should see «([^«]*)«$/’
features/manage_locations.feature:23:in `Then I should see «Shiny location«
Failing Scenarios:
cucumber -p wip features/manage_locations.feature:19 # Scenario: Create a new location
1 scenario (1 failed)
4 steps (1 failed, 3 passed)
0m0.613s
The —wip switch was used, so the failures were expected. All is good.

view raw
gistfile1.sh
hosted with ❤ by GitHub

В самом деле? Та же ошибка? Давайте посмотрим назад на наши маршруты. Первый маршрут в файле — это действие index. То, как работают маршруты, побеждает первый матч. Поскольку оба маршрута имеют названия местоположений, действие index всегда побеждает. У нас есть два возможных решения. Переместите маршрут создания действия в начало или добавьте :via => get к действию index.
Мне нравится последнее. Давайте сделаем маршрут действия индекса похожим на:

match ‘locations/’ => ‘locations#index’, :as => :locations, :via => [:get]

view raw
gistfile1.rb
hosted with ❤ by GitHub

Перепроверьте маршруты:

locations GET (/:locale)/locations(.:format) locations#index
new_locations (/:locale)/locations/new(.:format) locations#new
locations POST (/:locale)/locations(.:format) locations#create
root /(:locale)(.:format) locations#index

view raw
gistfile1.rb
hosted with ❤ by GitHub

ОК, только действия GET вызовут страницу индекса. Наш сценарий должен быть счастливым или, по крайней мере, больше не жаловаться на маршруты.

$ cucumber —profile wip
Using the wip profile…
Feature: Manage locations
In order to manage locations
As a user
I want to create and edit my locations.
@wip
Scenario: Create a new location # features/manage_locations.feature:19
Given I am on new location page # features/step_definitions/location_steps.rb:22
And I fill in «Name« with «Shiny location« # features/step_definitions/location_steps.rb:26
When I press «Create« # features/step_definitions/location_steps.rb:30
The action create could not be found for LocationsController (AbstractController::ActionNotFound)
(eval):2:in `click_button
./features/step_definitions/location_steps.rb:31:in `/^I press «([^»]*)»$/
features/manage_locations.feature:22:in `When I press «Create«
Then I should see «Shiny location» # features/step_definitions/location_steps.rb:9
Failing Scenarios:
cucumber -p wip features/manage_locations.feature:19 # Scenario: Create a new location
1 scenario (1 failed)
4 steps (1 failed, 1 skipped, 2 passed)
0m0.558s
The —wip switch was used, so the failures were expected. All is good.

view raw
gistfile1.sh
hosted with ❤ by GitHub

Конечно же, есть новая ошибка. The action 'create' could not be found for LocationsController . Вы можете увидеть, как использование Cucumber для управления дизайном приложения на Rails может привести к хорошей повторяющейся последовательности создания маршрута, действия и представления для сценария.

Здесь мы забыли C часть CRUD. Откройте location_controller и добавьте метод создания.

# POST /locations
# POST /locations.json
def create
@location = Location.new(params[:location])
respond_to do |format|
if @location.save
format.html { redirect_to @location, notice: ‘Location was successfully created.’ }
format.json { render json: @location, status: :created, location: @location }
else
format.html { render action: «new» }
format.json { render json: @location.errors, status: :unprocessable_entity }
end
end
end

view raw
gistfile1.rb
hosted with ❤ by GitHub

Давайте запустим тест.

$ cucumber —profile wip
Using the wip profile…
Feature: Manage locations
In order to manage locations
As a user
I want to create and edit my locations.
@wip
Scenario: Create a new location # features/manage_locations.feature:19
Given I am on new location page # features/step_definitions/location_steps.rb:22
And I fill in «Name« with «Shiny location« # features/step_definitions/location_steps.rb:26
When I press «Create« # features/step_definitions/location_steps.rb:30
undefined method `location_url for #<LocationsController:0x00000100c24330> (NoMethodError)
./app/controllers/locations_controller.rb:29:in `block (2 levels) in create
./app/controllers/locations_controller.rb:27:in `create
(eval):2:in `click_button
./features/step_definitions/location_steps.rb:31:in `/^I press «([^«]*)«$/’
features/manage_locations.feature:22:in `When I press «Create«
Then I should see «Shiny location» # features/step_definitions/location_steps.rb:9
Failing Scenarios:
cucumber -p wip features/manage_locations.feature:19 # Scenario: Create a new location
1 scenario (1 failed)
4 steps (1 failed, 1 skipped, 2 passed)
0m0.652s
The —wip switch was used, so the failures were expected. All is good.

view raw
gistfile1.sh
hosted with ❤ by GitHub

Хм. В методе создания мы перенаправляем его на @locations. Нам нужно добавить маршрут для этого.
В файле route.rb добавьте:

match «locations/show/(:id)» => ‘locations#show’, :as => :location

view raw
gistfile1.rb
hosted with ❤ by GitHub

Это завершает сценарий?

$ cucumber —profile wip
Using the wip profile…
Feature: Manage locations
In order to manage locations
As a user
I want to create and edit my locations.
@wip
Scenario: Create a new location # features/manage_locations.feature:19
Given I am on new location page # features/step_definitions/location_steps.rb:22
And I fill in «Name« with «Shiny location« # features/step_definitions/location_steps.rb:26
When I press «Create« # features/step_definitions/location_steps.rb:30
The action show could not be found for LocationsController (AbstractController::ActionNotFound)
(eval):2:in `click_button
./features/step_definitions/location_steps.rb:31:in `/^I press «([^»]*)»$/
features/manage_locations.feature:22:in `When I press «Create«
Then I should see «Shiny location» # features/step_definitions/location_steps.rb:9
Failing Scenarios:
cucumber -p wip features/manage_locations.feature:19 # Scenario: Create a new location
1 scenario (1 failed)
4 steps (1 failed, 1 skipped, 2 passed)
0m0.653s
The —wip switch was used, so the failures were expected. All is good.

view raw
gistfile1.sh
hosted with ❤ by GitHub

Нет, похоже, нам нужно добавить действие шоу. Откройте файл location_controller.rb и добавьте:

# GET /locations/1
# GET /locations/1.json
def show
@location = Location.find(params[:id])
respond_to do |format|
format.html # show.html.erb
format.json { render json: @location }
end
end

view raw
gistfile1.rb
hosted with ❤ by GitHub

Я уверен, что это будет работать сейчас.

$ cucumber —profile wip
Using the wip profile…
Feature: Manage locations
In order to manage locations
As a user
I want to create and edit my locations.
@wip
Scenario: Create a new location # features/manage_locations.feature:19
Given I am on new location page # features/step_definitions/location_steps.rb:22
And I fill in «Name« with «Shiny location« # features/step_definitions/location_steps.rb:26
When I press «Create« # features/step_definitions/location_steps.rb:30
Missing template locations/show, application/show with {:locale=>[:en], :formats=>[:html], :handlers=>[:erb, :builder, :coffee]}. Searched in:
* «/Users/john/Sites/zzz/app/views«
(ActionView::MissingTemplate)
/Users/john/.rvm/rubies/ruby-1.9.3-p0/lib/ruby/1.9.1/benchmark.rb:295:in `realtime
./app/controllers/locations_controller.rb:43:in `show
(eval):2:in `click_button
./features/step_definitions/location_steps.rb:31:in `/^I press «([^»]*)»$/
features/manage_locations.feature:22:in `When I press «Create«
Then I should see «Shiny location» # features/step_definitions/location_steps.rb:9
Failing Scenarios:
cucumber -p wip features/manage_locations.feature:19 # Scenario: Create a new location
1 scenario (1 failed)
4 steps (1 failed, 1 skipped, 2 passed)
0m0.613s
The —wip switch was used, so the failures were expected. All is good.

view raw
gistfile1.sh
hosted with ❤ by GitHub

К сожалению, нам нужно добавить файл show.html.erb. Создайте его в папке / app / views / location и добавьте код для отображения местоположения.

<p><%= @location.name %></p>

view raw
gistfile1.rb
hosted with ❤ by GitHub

Да, это не очень интересно, но мы просто сдаем тесты.

$ cucumber —profile wip
Using the wip profile…
Feature: Manage locations
In order to manage locations
As a user
I want to create and edit my locations.
@wip
Scenario: Create a new location # features/manage_locations.feature:19
Given I am on new location page # features/step_definitions/location_steps.rb:22
And I fill in «Name« with «Shiny location« # features/step_definitions/location_steps.rb:26
When I press «Create« # features/step_definitions/location_steps.rb:30
Then I should see «Shiny location« # features/step_definitions/location_steps.rb:9
1 scenario (1 passed)
4 steps (4 passed)
0m0.585s
The —wip switch was used, so I didnt expect anything to pass. These scenarios passed:
(::) passed scenarios (::)
features/manage_locations.feature:19:in `Scenario: Create a new location

view raw
gistfile1.sh
hosted with ❤ by GitHub

ВСЕ ЗЕЛЕНЫЕ!
Готовы к перерыву?

La Creación de Nuevas Ubicaciones

Сценарий с английским (по умолчанию) языком проходит, сейчас самое время сосредоточиться на испанском. Создайте новый сценарий в /features/manage_locations.feature.

@wip
Scenario: Create a new location
Given I am on the es site
And I am on new location page
And I fill in «Nombre» with «Shiny location»
When I press «crear»
Then I should see «Shiny location»

view raw
gistfile1.rb
hosted with ❤ by GitHub

Бьюсь об заклад, вы можете догадаться, какой будет результат этого сценария …

$ cucumber —profile wip
Using the wip profile…
Feature: Manage locations
In order to manage locations
As a user
I want to create and edit my locations.
@wip
Scenario: Create a new location # features/manage_locations.feature:19
Given I am on new location page # features/step_definitions/location_steps.rb:22
And I fill in «Name« with «Shiny location« # features/step_definitions/location_steps.rb:26
When I press «Create« # features/step_definitions/location_steps.rb:30
Then I should see «Shiny location« # features/step_definitions/location_steps.rb:9
@wip
Scenario: Create a new location # features/manage_locations.feature:25
Given I am on the es site # features/step_definitions/location_steps.rb:17
And I am on new location page # features/step_definitions/location_steps.rb:22
And I fill in «Nombre« with «buena ubicación« # features/step_definitions/location_steps.rb:26
cannot fill in, no text field, text area or password field with id, name, or label Nombre found (Capybara::ElementNotFound)
(eval):2:in `fill_in
./features/step_definitions/location_steps.rb:27:in `/^I fill in «([^»]*)» with «([^»]*)»$/
features/manage_locations.feature:28:in `And I fill in «Nombre« with «buena ubicación«
When I press «crear» # features/step_definitions/location_steps.rb:30
Then I should see «buena ubicación» # features/step_definitions/location_steps.rb:9
Failing Scenarios:
cucumber -p wip features/manage_locations.feature:25 # Scenario: Create a new location
2 scenarios (1 failed, 1 passed)
9 steps (1 failed, 2 skipped, 6 passed)
0m1.319s
The —wip switch was used, so I didnt expect anything to pass. These scenarios passed:
(::) passed scenarios (::)
features/manage_locations.feature:19:in `Scenario: Create a new location

view raw
gistfile1.sh
hosted with ❤ by GitHub

Первые два шага одинаковы, поэтому они проходят с летающими цветами. Однако, наши виджеты теперь названы для локали, которую мы используем (и), и Cucumber не может найти. Помните I18n.translate? Мы снова используем это для поля имени. Откройте файл new.html.erb в папке представлений.

<%= form_for(@location) do |f| %>
<p>
<%= f.label :name, t(‘.name_html’) %>
<%= f.text_field :name %>
</p>
<p>
<%= f.submit %>
</p>
<% end %>

view raw
gistfile1.rb
hosted with ❤ by GitHub

Если мы сейчас запустим тест, оба сценария @wip потерпят неудачу, так как мы вызываем функцию перевода и мы не предоставили переводы. Давайте добавим их сейчас.
В папке / config / locales откройте файл en.yml и добавьте:

en:
locations:
index:
title_html: «Locations«
new:
name_html: «Name«

view raw
gistfile1.yml
hosted with ❤ by GitHub

Не забывайте испанский. Откройте файл es.yml и добавьте:

es:
locations:
index:
title_html: «Locaciones«
new:
name_html: «Nombre«

view raw
gistfile1.yml
hosted with ❤ by GitHub

Бьюсь об заклад, он может найти поле имени в обоих случаях сейчас.

$ cucumber —profile wip
Using the wip profile…
Feature: Manage locations
In order to manage locations
As a user
I want to create and edit my locations.
@wip
Scenario: Create a new location # features/manage_locations.feature:19
Given I am on new location page # features/step_definitions/location_steps.rb:22
And I fill in «Name« with «Shiny location« # features/step_definitions/location_steps.rb:26
When I press «Create« # features/step_definitions/location_steps.rb:30
Then I should see «Shiny location« # features/step_definitions/location_steps.rb:9
@wip
Scenario: Create a new location # features/manage_locations.feature:25
Given I am on the es site # features/step_definitions/location_steps.rb:17
And I am on new location page # features/step_definitions/location_steps.rb:22
And I fill in «Nombre« with «buena ubicación« # features/step_definitions/location_steps.rb:26
When I press «crear« # features/step_definitions/location_steps.rb:30
no button with value or id or text crear found (Capybara::ElementNotFound)
(eval):2:in `click_button
./features/step_definitions/location_steps.rb:31:in `/^I press «([^»]*)»$/
features/manage_locations.feature:29:in `When I press «crear«
Then I should see «buena ubicación» # features/step_definitions/location_steps.rb:9
Failing Scenarios:
cucumber -p wip features/manage_locations.feature:25 # Scenario: Create a new location
2 scenarios (1 failed, 1 passed)
9 steps (1 failed, 1 skipped, 7 passed)
0m0.648s
The —wip switch was used, so I didnt expect anything to pass. These scenarios passed:
(::) passed scenarios (::)
features/manage_locations.feature:19:in `Scenario: Create a new location

view raw
gistfile1.sh
hosted with ❤ by GitHub

Похоже, нам нужно сделать то же самое для кнопки создания. На странице new.html.erb мы изменим кнопку отправки.

<p>
<%= f.button t(‘.button_html’) %>
</p>

view raw
gistfile1.rb
hosted with ❤ by GitHub

Конечно, мы должны добавить button_html в локали.
файл en.yml:

en:
locations:
index:
title_html: «Locations«
new:
name_html: «Name«
button_html: «Create«

view raw
gistfile1.yml
hosted with ❤ by GitHub

файл es.yml:

es:
locations:
index:
title_html: «Locaciones«
new:
name_html: «Nombre«
button_html: «crear«

view raw
gistfile1.yml
hosted with ❤ by GitHub

Мы все?

$ cucumber —profile wip
Using the wip profile…
Feature: Manage locations
In order to manage locations
As a user
I want to create and edit my locations.
@wip
Scenario: Create a new location # features/manage_locations.feature:19
Given I am on new location page # features/step_definitions/location_steps.rb:22
And I fill in «Name« with «Shiny location« # features/step_definitions/location_steps.rb:26
When I press «Create« # features/step_definitions/location_steps.rb:30
Then I should see «Shiny location« # features/step_definitions/location_steps.rb:9
@wip
Scenario: Create a new location # features/manage_locations.feature:25
Given I am on the es site # features/step_definitions/location_steps.rb:17
And I am on new location page # features/step_definitions/location_steps.rb:22
And I fill in «Nombre« with «buena ubicación« # features/step_definitions/location_steps.rb:26
When I press «crear« # features/step_definitions/location_steps.rb:30
Then I should see «buena ubicación« # features/step_definitions/location_steps.rb:9
2 scenarios (2 passed)
9 steps (9 passed)
0m0.689s
The —wip switch was used, so I didnt expect anything to pass. These scenarios passed:
(::) passed scenarios (::)
features/manage_locations.feature:19:in `Scenario: Create a new location
features/manage_locations.feature:25:in `Scenario: Create a new location

view raw
gistfile1.sh
hosted with ❤ by GitHub

Ура! Однако, прежде чем мы отпразднуем, у нас есть пара дел. Удалите теги @wip из файла объектов и повторно запустите сценарии.

$ cucumber
Using the default profile…
Feature: Manage locations
In order to manage locations
As a user
I want to create and edit my locations.
Scenario: List a location. # features/manage_locations.feature:6
Given there is a location named «location 1« # features/step_definitions/location_steps.rb:1
When I am on the locations page # features/step_definitions/location_steps.rb:5
Then I should see «Locations« # features/step_definitions/location_steps.rb:9
And I should see «location 1« # features/step_definitions/location_steps.rb:9
Scenario: List a location. # features/manage_locations.feature:12
Given there is a location named «location 1« # features/step_definitions/location_steps.rb:1
And I am on the es site # features/step_definitions/location_steps.rb:17
When I am on the locations page # features/step_definitions/location_steps.rb:5
Then I should see «Locaciones« # features/step_definitions/location_steps.rb:9
And I should see «location 1« # features/step_definitions/location_steps.rb:9
Scenario: Create a new location # features/manage_locations.feature:19
Given I am on new location page # features/step_definitions/location_steps.rb:22
And I fill in «Name« with «Shiny location« # features/step_definitions/location_steps.rb:26
cannot fill in, no text field, text area or password field with id, name, or label Name found (Capybara::ElementNotFound)
(eval):2:in `fill_in
./features/step_definitions/location_steps.rb:27:in `/^I fill in «([^»]*)» with «([^»]*)»$/
features/manage_locations.feature:21:in `And I fill in «Name« with «Shiny location«
When I press «Create» # features/step_definitions/location_steps.rb:30
Then I should see «Shiny location» # features/step_definitions/location_steps.rb:9
Scenario: Create a new location # features/manage_locations.feature:25
Given I am on the es site # features/step_definitions/location_steps.rb:17
And I am on new location page # features/step_definitions/location_steps.rb:22
And I fill in «Nombre» with «buena ubicación» # features/step_definitions/location_steps.rb:26
When I press «crear» # features/step_definitions/location_steps.rb:30
Then I should see «buena ubicación» # features/step_definitions/location_steps.rb:9
Failing Scenarios:
cucumber features/manage_locations.feature:19 # Scenario: Create a new location
4 scenarios (1 failed, 3 passed)
18 steps (1 failed, 2 skipped, 15 passed)
0m0.707s

view raw
gistfile1.sh
hosted with ❤ by GitHub

Какая?? В третьем сценарии он думает, что локаль — это es поскольку это то, что мы установили во втором сценарии. В английских сценариях нам нужно добавить локаль в сценарии.

Feature: Manage locations
In order to manage locations
As a user
I want to create and edit my locations.
Scenario: List a location.
Given there is a location named «location 1»
And I am on the en site
When I am on the locations page
Then I should see «Locations»
And I should see «location 1»
Scenario: List a location.
Given there is a location named «location 1»
And I am on the es site
When I am on the locations page
Then I should see «Locaciones»
And I should see «location 1»
Scenario: Create a new location
Given I am on the en site
And I am on new location page
And I fill in «Name» with «Shiny location»
When I press «Create»
Then I should see «Shiny location»
Scenario: Create a new location
Given I am on the es site
And I am on new location page
And I fill in «Nombre» with «buena ubicación»
When I press «crear»
Then I should see «buena ubicación»

Скрещенные пальцы…

$ cucumber
Using the default profile…
Feature: Manage locations
In order to manage locations
As a user
I want to create and edit my locations.
Scenario: List a location. # features/manage_locations.feature:6
Given there is a location named «location 1« # features/step_definitions/location_steps.rb:1
And I am on the en site # features/step_definitions/location_steps.rb:17
When I am on the locations page # features/step_definitions/location_steps.rb:5
Then I should see «Locations« # features/step_definitions/location_steps.rb:9
And I should see «location 1« # features/step_definitions/location_steps.rb:9
Scenario: List a location. # features/manage_locations.feature:13
Given there is a location named «location 1« # features/step_definitions/location_steps.rb:1
And I am on the es site # features/step_definitions/location_steps.rb:17
When I am on the locations page # features/step_definitions/location_steps.rb:5
Then I should see «Locaciones« # features/step_definitions/location_steps.rb:9
And I should see «location 1« # features/step_definitions/location_steps.rb:9
Scenario: Create a new location # features/manage_locations.feature:20
Given I am on the en site # features/step_definitions/location_steps.rb:17
And I am on new location page # features/step_definitions/location_steps.rb:22
And I fill in «Name« with «Shiny location« # features/step_definitions/location_steps.rb:26
When I press «Create« # features/step_definitions/location_steps.rb:30
Then I should see «Shiny location« # features/step_definitions/location_steps.rb:9
Scenario: Create a new location # features/manage_locations.feature:27
Given I am on the es site # features/step_definitions/location_steps.rb:17
And I am on new location page # features/step_definitions/location_steps.rb:22
And I fill in «Nombre« with «buena ubicación« # features/step_definitions/location_steps.rb:26
When I press «crear« # features/step_definitions/location_steps.rb:30
Then I should see «buena ubicación« # features/step_definitions/location_steps.rb:9
4 scenarios (4 passed)
20 steps (20 passed)
0m0.841s

view raw
gistfile1.sh
hosted with ❤ by GitHub

Excelente! Тодос сын Вердес.

В следующей части этой серии мы будем редактировать локации.

ДОПОЛНИТЕЛЬНЫЙ КРЕДИТ:

Контуры сценария.

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

Feature: Manage locations
In order to manage locations
As a user
I want to create and edit my locations.
Scenario Outline: List locations
Given there is a location named «<location>»
And I am on the <language> site
When I am on the locations page
Then I should see «<title>»
And I should see «<result>»
Examples:
| location | language | title | result |
| location 1 | en | Locations | location 1 |
| location 2 | es | Locaciones | location 2 |
Scenario Outline:: Create a new location
Given I am on the <language> site
And I am on new location page
And I fill in «<name>» with «<location>»
When I press «<button>»
Then I should see «<result>»
Examples:
| language | name | location | button | result |
| en | Name | location 1 | Create | location 1 |
| es | Nombre | location 1 | crear | location 1 |

Прелесть этого в том, что если вы хотите добавить тест, например, для проверки имени, мы можем легко добавить его в Примеры, как я сделал ниже:

Examples:
| language | name | location | button | result |
| en | Name | location 1 | Create | location 1 |
| es | Nombre | location 1 | crear | location 1 |
| en | Name | | Create | Name cannon be blank |

view raw
gistfile1.rb
hosted with ❤ by GitHub

Увидимся в следующий раз. Hasta Luego!