Редактирование местоположения.
В первой части мы создали приложение, в котором перечислены местоположения на английском и испанском языках. Во второй части мы добавили возможность создавать новые локации на английском и испанском языках.
В этой части мы отредактируем местоположение, показывая пути локализации. Помните, что мы используем Cucumber и BDD для запуска нашего приложения.
Давайте напишем сценарий для этого.
Scenario: Edit a location | |
Given there is a location named «location 1» | |
And I am on the en site | |
When I Update the location Name to «location has changed» | |
Then I should see «location has changed» |
Прежде чем мы сделаем это, давайте сделаем шаг назад. В конце второй части мы реорганизовали наши сценарии в наброски сценариев. Подобный сценарий мы напишем позже, чтобы сохранить рефакторинг. Мы также будем использовать тег @wip, поэтому сейчас мы можем сосредоточиться на этом тесте.
@wip | |
Scenario Outline: Edit a location | |
Given I am on the <language> site | |
And there is a location named «<location>» | |
When I «<action>» the location «<field>» to «<new_name>» | |
Then I should see «<new_name>» | |
Examples: | |
| language | location | action | field | new_name | | |
| en | location 1 | Update | Name | location has changed | |
Пример таблицы содержит параметры для наших сценариев. Параметры — это язык, имя исходного местоположения, действие, которое нужно выполнить, и метка для поля имени. Последний параметр указывает сообщение, отображаемое после завершения действия.
Давайте добавим это в наш файл /features/managing_locations.feature. Запустите Огурец и посмотрите, что получится.
$ 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 Outline: Edit a location # features/managing_locations.feature:31 | |
Given I am on the <language> site # features/step_definitions/location_steps.rb:5 | |
And there is a location named «<location>« # features/step_definitions/location_steps.rb:1 | |
When I «<action>« the location «<field>« to «<new_name>« # features/managing_locations.feature:34 | |
Then I should see «<new_name>« # features/step_definitions/location_steps.rb:13 | |
Examples: | |
| language | location | action | field | new_name | | |
| en | location 1 | Update | Name | location has changed | | |
1 scenario (1 undefined) | |
4 steps (1 skipped, 1 undefined, 2 passed) | |
0m1.289s | |
You can implement step definitions for undefined steps with these snippets: | |
When /^I «([^«]*)« the location «([^«]*)« to «([^«]*)«$/ do |arg1, arg2, arg3| | |
pending # express the regexp above with the code you wish you had | |
end | |
The —wip switch was used, so the failures were expected. All is good. |
Не так уж плохо. Пара шагов уже пройдена. Огурец говорит нам, что делать дальше. Как бы вы «обновили» местоположение «Имя» до «Новое имя»?
Как насчет?
+ Перейти на страницу местоположения.
+ Нажмите на ссылку для редактирования.
+ Заполните поле имени нашим новым названием местоположения.
+ Нажмите кнопку обновления.
Звучит хорошо, давайте напишем эти шаги.
Откройте up / features / step определений / location steps.rb и добавьте эти шаги.
When /^I «([^»]*)» the location «([^«]*)» to «([^»]*)«$/ do |button, field, value| | |
visit(location_path(Location.first, :locale => I18n.locale.to_s)) | |
click_link «Edit« | |
fill_in(field, :with => value) | |
click_button(button) | |
end |
Имеет ли это смысл?
Поскольку мы создали местоположение на более раннем этапе, мы получаем первое местоположение. Мы также передаем язык. Это сделает следующий маршрут «/ en / location / 1». Благодаря Capybara будет нажата ссылка «Изменить». Форма будет заполнена. И кнопка отправки будет нажата.
Думаешь, это сработает? Запустим огурец.
$ 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 Outline: Edit a location # features/managing_locations.feature:31 | |
Given I am on the <language> site # features/step_definitions/location_steps.rb:5 | |
And there is a location named «<location>« # features/step_definitions/location_steps.rb:1 | |
When I «<action>« the location «<field>« to «<new_name>« # features/step_definitions/location_steps.rb:33 | |
Then I should see «<new_name>« # features/step_definitions/location_steps.rb:13 | |
Examples: | |
| language | location | action | field | new_name | | |
| en | location 1 | Update | Name | location has changed | | |
no link with title, id or text ‘Edit‘ found (Capybara::ElementNotFound) | |
(eval):2:in `click_link‘ | |
./features/step_definitions/location_steps.rb:35:in `/^I «([^»]*)» the location «([^»]*)» to «([^»]*)»$/‘ | |
features/managing_locations.feature:34:in `When I «<action>« the location «<field>« to «<new_name>«‘ | |
Failing Scenarios: | |
cucumber -p wip features/managing_locations.feature:31 # Scenario: Edit a location | |
1 scenario (1 failed) | |
4 steps (1 failed, 1 skipped, 2 passed) | |
0m2.123s | |
The —wip switch was used, so the failures were expected. All is good. |
Все в порядке. Огурец руководит следующей задачей: добавление ссылки редактирования на странице шоу. Откройте /app/views/locations/show.html.erb
<p><%= link_to «Edit», edit_location_path(@location) %></p> |
Бросить кости.
$ 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 Outline: Edit a location # features/managing_locations.feature:31 | |
Given I am on the <language> site # features/step_definitions/location_steps.rb:5 | |
And there is a location named «<location>« # features/step_definitions/location_steps.rb:1 | |
When I «<action>« the location «<field>« to «<new_name>« # features/step_definitions/location_steps.rb:33 | |
Then I should see «<new_name>« # features/step_definitions/location_steps.rb:13 | |
Examples: | |
| language | location | action | field | new_name | | |
| en | location 1 | Update | Name | location has changed | | |
undefined method `edit_location_path‘ for #<#<Class:0xb4954c>:0xb1bde0> (ActionView::Template::Error) | |
./app/views/locations/show.html.erb:2:in `_app_views_locations_show_html_erb___614471579_8136790‘ | |
… | |
./features/step_definitions/location_steps.rb:34:in `/^I «([^«]*)« the location «([^«]*)« to «([^«]*)«$/’ | |
features/managing_locations.feature:34:in `When I «<action>« the location «<field>« to «<new_name>«‘ | |
Failing Scenarios: | |
cucumber -p wip features/managing_locations.feature:31 # Scenario: Edit a location | |
1 scenario (1 failed) | |
4 steps (1 failed, 1 skipped, 2 passed) | |
0m2.041s | |
The —wip switch was used, so the failures were expected. All is good. |
Нам нужно определить маршрут edit_location. Мы можем это сделать. Откройте /config/routes.rb и, над корневым маршрутом, добавьте
Это должно сделать это. Огурец, давай рвем.
$ 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 Outline: Edit a location # features/managing_locations.feature:31 | |
Given I am on the <language> site # features/step_definitions/location_steps.rb:5 | |
And there is a location named «<location>« # features/step_definitions/location_steps.rb:1 | |
When I «<action>« the location «<field>« to «<new_name>« # features/step_definitions/location_steps.rb:33 | |
Then I should see «<new_name>« # features/step_definitions/location_steps.rb:13 | |
Examples: | |
| language | location | action | field | new_name | | |
| en | location 1 | Update | Name | location has changed | | |
The action ‘edit‘ could not be found for LocationsController (AbstractController::ActionNotFound) | |
(eval):2:in `click_link‘ | |
./features/step_definitions/location_steps.rb:35:in `/^I «([^»]*)» the location «([^»]*)» to «([^»]*)»$/‘ | |
features/managing_locations.feature:34:in `When I «<action>« the location «<field>« to «<new_name>«‘ | |
Failing Scenarios: | |
cucumber -p wip features/managing_locations.feature:31 # Scenario: Edit a location | |
1 scenario (1 failed) | |
4 steps (1 failed, 1 skipped, 2 passed) | |
0m2.255s | |
The —wip switch was used, so the failures were expected. All is good. |
А? Нам нужно добавить действие редактирования в контроллере локаций. Откройте файл контроллера местоположения и добавьте это действие
# GET /locations/1/edit | |
def edit | |
@location = Location.find(params[:id]) | |
end |
Второй стих, такой же, как первый. Перезапустите тест.
$ 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 Outline: Edit a location # features/managing_locations.feature:31 | |
Given I am on the <language> site # features/step_definitions/location_steps.rb:5 | |
And there is a location named «<location>« # features/step_definitions/location_steps.rb:1 | |
When I «<action>« the location «<field>« to «<new_name>« # features/step_definitions/location_steps.rb:33 | |
Then I should see «<new_name>« # features/step_definitions/location_steps.rb:13 | |
Examples: | |
| language | location | action | field | new_name | | |
| en | location 1 | Update | Name | location has changed | | |
Missing template locations/edit, application/edit with {:locale=>[:en], :formats=>[:html], :handlers=>[:erb, :builder, :coffee]}. Searched in: | |
* «/Users/johnivanoff/Sites/international/app/views« | |
(ActionView::MissingTemplate) | |
/Users/johnivanoff/.rvm/rubies/ruby-1.9.2-p180/lib/ruby/1.9.1/benchmark.rb:309:in `realtime‘ | |
(eval):2:in `click_link‘ | |
./features/step_definitions/location_steps.rb:35:in `/^I «([^«]*)« the location «([^«]*)« to «([^«]*)«$/’ | |
features/managing_locations.feature:34:in `When I «<action>« the location «<field>« to «<new_name>«‘ | |
Failing Scenarios: | |
cucumber -p wip features/managing_locations.feature:31 # Scenario: Edit a location | |
1 scenario (1 failed) | |
4 steps (1 failed, 1 skipped, 2 passed) | |
0m2.088s | |
The —wip switch was used, so the failures were expected. All is good. |
Нам нужна страница редактирования. Поскольку наша страница редактирования и новая страница совпадают, мы объединяем их, используя партиалы. Сделайте страницу формы, а затем включите это частичное в новые и редактировать страницы. Извлеките форму из файла new.html.erb и вставьте ее в /app/views/locations/_form.html.erb
_form.html.erb
<%= form_for(@location) do |f| %> | |
<p> | |
<%= f.label :name, t(‘.name_html’) %> | |
<%= f.text_field :name %> | |
</p> | |
<p> | |
<%= f.button t(‘.button_html’) %> | |
</p> | |
<% end %> |
В new.html.erb вызовите эту форму частичной.
new.html.erb
<%= render ‘form’ %> |
Страница редактирования выглядит очень похоже …
edit.html.erb
<%= render ‘form’ %> |
Давайте запустим тест и посмотрим, какой урон мы нанесли.
$ 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 Outline: Edit a location # features/managing_locations.feature:31 | |
Given I am on the <language> site # features/step_definitions/location_steps.rb:5 | |
And there is a location named «<location>« # features/step_definitions/location_steps.rb:1 | |
When I «<action>« the location «<field>« to «<new_name>« # features/step_definitions/location_steps.rb:33 | |
Then I should see «<new_name>« # features/step_definitions/location_steps.rb:13 | |
Examples: | |
| language | location | action | field | new_name | | |
| en | location 1 | Update | Name | location has changed | | |
no button with value or id or text ‘Update‘ found (Capybara::ElementNotFound) | |
(eval):2:in `click_button‘ | |
./features/step_definitions/location_steps.rb:37:in `/^I «([^»]*)» the location «([^»]*)» to «([^»]*)»$/‘ | |
features/managing_locations.feature:34:in `When I «<action>« the location «<field>« to «<new_name>«‘ | |
Failing Scenarios: | |
cucumber -p wip features/managing_locations.feature:31 # Scenario: Edit a location | |
1 scenario (1 failed) | |
4 steps (1 failed, 1 skipped, 2 passed) | |
0m2.343s | |
The —wip switch was used, so the failures were expected. All is good. |
Мы не видим кнопку обновления.
Согласно файлу en.yml на кнопке будет написано «Создать». Если мы изменим это на Update, то тест для Create не будет выполнен. В исходной форме было только <% = f.submit%> для кнопки, и она знала, когда сказать «Создать» или «Обновить». Давайте углубимся в исходный код rails и посмотрим, как это работает.
Проверьте помощники формы для вида действия в строке 1064, где объясняется, как это работает. И, OMG, они говорят нам, что делать при использовании i18n. Чертовски круто!
# Those labels can be customized using I18n, under the helpers.submit key and accept | |
# the %{model} as translation interpolation: | |
# | |
# en: | |
# helpers: | |
# submit: | |
# create: «Create a %{model}» | |
# update: «Confirm changes to %{model}» |
Теперь обновите файл en.yml, чтобы отразить это.
en: | |
helpers: | |
submit: | |
create: «Create %{model}« | |
update: «Update %{model}« | |
locations: | |
index: | |
title_html: «Locations« | |
new: | |
name_html: «Name« |
Запустите тест.
ПОДОЖДИТЕ! Посмотри, что мы сделали. У нас больше нет файла .button_html в файле en.yml. Теперь мы говорим, что помощник для отправки скажет либо «Создать для публикации», либо «Обновление». При этом нам нужно изменить кнопку в форме обратно на подход по умолчанию.
<%= form_for(@location) do |f| %> | |
<p> | |
<%= f.label :name, t(‘.name_html’) %> | |
<%= f.text_field :name %> | |
</p> | |
<p> | |
<%= f.submit %> | |
</p> | |
<% end %> |
Это чувствует себя чище.
$ 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 Outline: Edit a location # features/managing_locations.feature:31 | |
Given I am on the <language> site # features/step_definitions/location_steps.rb:5 | |
And there is a location named «<location>« # features/step_definitions/location_steps.rb:1 | |
When I «<action>« the location «<field>« to «<new_name>« # features/step_definitions/location_steps.rb:33 | |
Then I should see «<new_name>« # features/step_definitions/location_steps.rb:13 | |
Examples: | |
| language | location | action | field | new_name | | |
| en | location 1 | Update | Name | location has changed | | |
expected there to be content «location has changed« in «International\n\nlocation 1\nEdit\n\n« (RSpec::Expectations::ExpectationNotMetError) | |
./features/step_definitions/location_steps.rb:15:in `/^(?:|I )should see «([^«]*)«$/’ | |
features/managing_locations.feature:35:in `Then I should see «<new_name>«‘ | |
Failing Scenarios: | |
cucumber -p wip features/managing_locations.feature:31 # Scenario: Edit a location | |
1 scenario (1 failed) | |
4 steps (1 failed, 3 passed) | |
0m2.175s | |
The —wip switch was used, so the failures were expected. All is good. |
_expected there to be content "location has changed" in "Internationalnnlocation 1nEditnn"_
Ожидается, что _expected there to be content "location has changed" in "Internationalnnlocation 1nEditnn"_
HMMM… это кажется неправильным. Почему все еще говорится местоположение 1 ? Давайте посмотрим на файл журнала испытаний.
Откройте /log/test.log и посмотрите последние несколько строк.
[1m[36m (0.1ms)[0m [1mbegin transaction[0m | |
[1m[35m (0.1ms)[0m SAVEPOINT active_record_1 | |
[1m[36mSQL (40.8ms)[0m [1mINSERT INTO «locations» («created_at», «name», «updated_at») VALUES (?, ?, ?)[0m [[«created_at», Wed, 07 Mar 2012 20:29:52 UTC +00:00], [«name», «location 1»], [«updated_at», Wed, 07 Mar 2012 20:29:52 UTC +00:00]] | |
[1m[35m (0.1ms)[0m RELEASE SAVEPOINT active_record_1 | |
[1m[36mLocation Load (0.2ms)[0m [1mSELECT «locations».* FROM «locations» LIMIT 1[0m | |
Started GET «/en/locations/1» for 127.0.0.1 at 2012-03-07 14:29:52 -0600 | |
Processing by LocationsController#show as HTML | |
Parameters: {«locale»=>»en», «id»=>»1»} | |
[1m[35mLocation Load (0.2ms)[0m SELECT «locations».* FROM «locations» WHERE «locations».»id» = ? LIMIT 1 [[«id», «1»]] | |
Rendered locations/show.html.erb within layouts/application (42.5ms) | |
Completed 200 OK in 207ms (Views: 201.2ms | ActiveRecord: 0.2ms) | |
Started GET «/en/locations/1/edit» for 127.0.0.1 at 2012-03-07 14:29:53 -0600 | |
Processing by LocationsController#edit as HTML | |
Parameters: {«locale»=>»en», «id»=>»1»} | |
[1m[36mLocation Load (0.1ms)[0m [1mSELECT «locations».* FROM «locations» WHERE «locations».»id» = ? LIMIT 1[0m [[«id», «1»]] | |
Rendered locations/_form.html.erb (4.7ms) | |
Rendered locations/edit.html.erb within layouts/application (30.1ms) | |
Completed 200 OK in 35ms (Views: 33.0ms | ActiveRecord: 0.1ms) | |
Started PUT «/en/locations/1» for 127.0.0.1 at 2012-03-07 14:29:53 -0600 | |
Processing by LocationsController#show as HTML | |
Parameters: {«utf8″=>»✓», «location»=>{«name»=>»location has changed»}, «commit»=>»Update Location», «locale»=>»en», «id»=>»1»} | |
[1m[35mLocation Load (0.1ms)[0m SELECT «locations».* FROM «locations» WHERE «locations».»id» = ? LIMIT 1 [[«id», «1»]] | |
Rendered locations/show.html.erb within layouts/application (0.7ms) | |
Completed 200 OK in 4ms (Views: 2.8ms | ActiveRecord: 0.1ms) | |
[1m[36m (0.9ms)[0m [1mrollback transaction[0m |
После действия редактирования он направляется к действию шоу. Проблема с маршрутизацией! Если вы посмотрите на последний запрос, запустили PUT «/ en / location / 1» для 127.0.0.1 . Он использует глагол PUT для обозначения действия обновления. У нас есть маршрут для / location /: id, и он идет к действию шоу. Поскольку этот маршрут может использовать любой глагол, GET, PUT или что-либо еще, этот маршрут должен реагировать только на GET. Затем нам нужно создать маршрут для действия обновления, которое отвечает только на PUT.
Давайте откроем файл маршрутов.
match «locations/(:id)» => ‘locations#show’, :as => :location, :via => [:get] | |
match «locations/(:id)» => ‘locations#update’, :as => :location, :via => [:put] |
Любые ставки? Это пройдет? Раскатать кубики огурца.
$ 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 Outline: Edit a location # features/managing_locations.feature:31 | |
Given I am on the <language> site # features/step_definitions/location_steps.rb:5 | |
And there is a location named «<location>« # features/step_definitions/location_steps.rb:1 | |
When I «<action>« the location «<field>« to «<new_name>« # features/step_definitions/location_steps.rb:33 | |
Then I should see «<new_name>« # features/step_definitions/location_steps.rb:13 | |
Examples: | |
| language | location | action | field | new_name | | |
| en | location 1 | Update | Name | location has changed | | |
The action ‘update‘ could not be found for LocationsController (AbstractController::ActionNotFound) | |
(eval):2:in `click_button‘ | |
./features/step_definitions/location_steps.rb:37:in `/^I «([^»]*)» the location «([^»]*)» to «([^»]*)»$/‘ | |
features/managing_locations.feature:34:in `When I «<action>« the location «<field>« to «<new_name>«‘ | |
Failing Scenarios: | |
cucumber -p wip features/managing_locations.feature:31 # Scenario: Edit a location | |
1 scenario (1 failed) | |
4 steps (1 failed, 1 skipped, 2 passed) | |
0m2.312s | |
The —wip switch was used, so the failures were expected. All is good. |
Вот и мы. Я ожидал эту ошибку. Давайте добавим действие обновления в контроллер.
# PUT /locations/1 | |
# PUT /locations/1.json | |
def update | |
@location = Location.find(params[:id]) | |
respond_to do |format| | |
if @location.update_attributes(params[:location]) | |
format.html { redirect_to @location, notice: ‘Location was successfully updated.’ } | |
format.json { head :ok } | |
else | |
format.html { render action: «edit» } | |
format.json { render json: @location.errors, status: :unprocessable_entity } | |
end | |
end | |
end |
Вы знаете, что делать дальше … перезапустите тест.
$ 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 Outline: Edit a location # features/managing_locations.feature:31 | |
Given I am on the <language> site # features/step_definitions/location_steps.rb:5 | |
And there is a location named «<location>« # features/step_definitions/location_steps.rb:1 | |
When I «<action>« the location «<field>« to «<new_name>« # features/step_definitions/location_steps.rb:33 | |
Then I should see «<new_name>« # features/step_definitions/location_steps.rb:13 | |
Examples: | |
| language | location | action | field | new_name | | |
| en | location 1 | Update | Name | location has changed | | |
1 scenario (1 passed) | |
4 steps (4 passed) | |
0m2.357s | |
The —wip switch was used, so I didn‘t expect anything to pass. These scenarios passed: | |
(::) passed scenarios (::) | |
features/managing_locations.feature:39:in `| en | location 1 | Update | Name | location has changed |‘ |
Перерыв!
Внедрение La Prueba Испанский
Давайте добавим испанскую часть сценария. Добавьте следующий конец в конец таблицы примеров.
| es | location 1 | Actualizar | Nombre | location has changed | |
Думаешь, все будет зеленым?
$ 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 Outline: Edit a location # features/managing_locations.feature:31 | |
Given I am on the <language> site # features/step_definitions/location_steps.rb:5 | |
And there is a location named «<location>« # features/step_definitions/location_steps.rb:1 | |
When I «<action>« the location «<field>« to «<new_name>« # features/step_definitions/location_steps.rb:33 | |
Then I should see «<new_name>« # features/step_definitions/location_steps.rb:13 | |
Examples: | |
| language | location | action | field | new_name | | |
| en | location 1 | Update | Name | location has changed | | |
| es | location 1 | Actualizar | Nombre | location has changed | | |
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:36:in `/^I «([^»]*)» the location «([^»]*)» to «([^»]*)»$/‘ | |
features/managing_locations.feature:34:in `When I «<action>« the location «<field>« to «<new_name>«‘ | |
Failing Scenarios: | |
cucumber -p wip features/managing_locations.feature:31 # Scenario: Edit a location | |
2 scenarios (1 failed, 1 passed) | |
8 steps (1 failed, 1 skipped, 6 passed) | |
0m2.508s | |
The —wip switch was used, so I didn‘t expect anything to pass. These scenarios passed: | |
(::) passed scenarios (::) | |
features/managing_locations.feature:39:in `| en | location 1 | Update | Name | location has changed |‘ |
Хорошо, это знакомо. нам нужно изменить файл es.yml, как мы делали файл en.yml. Откройте файл испанской локали.
Перезапустите тест. Идите зеленый!
$ 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 Outline: Edit a location # features/managing_locations.feature:31 | |
Given I am on the <language> site # features/step_definitions/location_steps.rb:5 | |
And there is a location named «<location>« # features/step_definitions/location_steps.rb:1 | |
When I «<action>« the location «<field>« to «<new_name>« # features/step_definitions/location_steps.rb:33 | |
Then I should see «<new_name>« # features/step_definitions/location_steps.rb:13 | |
Examples: | |
| language | location | action | field | new_name | | |
| en | location 1 | Update | Name | location has changed | | |
| es | location 1 | Actualizar | Nombre | location has changed | | |
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:36:in `/^I «([^»]*)» the location «([^»]*)» to «([^»]*)»$/‘ | |
features/managing_locations.feature:34:in `When I «<action>« the location «<field>« to «<new_name>«‘ | |
Failing Scenarios: | |
cucumber -p wip features/managing_locations.feature:31 # Scenario: Edit a location | |
2 scenarios (1 failed, 1 passed) | |
8 steps (1 failed, 1 skipped, 6 passed) | |
0m2.222s | |
The —wip switch was used, so I didn‘t expect anything to pass. These scenarios passed: | |
(::) passed scenarios (::) | |
features/managing_locations.feature:39:in `| en | location 1 | Update | Name | location has changed |‘ |
Странно, что работало в английской версии. Если мы запустим сервер rails и перейдем на страницу редактирования местоположения, то увидим, что в поле имени указано Name Html для английского и испанского языков. Что произошло? Давайте немного поразмышляем … Когда мы переместили форму из файла new.html.erb и поместили ее в файл _form.html.erb, мы не отразили это изменение в наших файлах локали. Давайте внесем это изменение в оба файла локали.
Прежде чем мы проведем тест снова, вы понимаете, почему тест по английскому языку прошел? Если вы сказали, что прошло, потому что «имя» на этикетке, вы правы. Раскланиваться.
Третий стих, такой же, как первый
$ 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 Outline: Edit a location # features/managing_locations.feature:31 | |
Given I am on the <language> site # features/step_definitions/location_steps.rb:5 | |
And there is a location named «<location>« # features/step_definitions/location_steps.rb:1 | |
When I «<action>« the location «<field>« to «<new_name>« # features/step_definitions/location_steps.rb:33 | |
Then I should see «<new_name>« # features/step_definitions/location_steps.rb:13 | |
Examples: | |
| language | location | action | field | new_name | | |
| en | location 1 | Update | Name | location has changed | | |
| es | location 1 | Actualizar | Nombre | location has changed | | |
2 scenarios (2 passed) | |
8 steps (8 passed) | |
0m2.528s | |
The —wip switch was used, so I didn‘t expect anything to pass. These scenarios passed: | |
(::) passed scenarios (::) | |
features/managing_locations.feature:39:in `| en | location 1 | Update | Name | location has changed |‘ | |
features/managing_locations.feature:40:in `| es | location 1 | Actualizar | Nombre | location has changed |‘ |
Прежде чем мы наберем пять, удалите тег wip из теста и запустите cucumber для запуска всех тестов.
$ 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 Outline: List locations # features/managing_locations.feature:6 | |
Given there is a location named «<location>« # features/step_definitions/location_steps.rb:1 | |
And I am on the <language> site # features/step_definitions/location_steps.rb:5 | |
When I am on the locations page # features/step_definitions/location_steps.rb:9 | |
Then I should see «<title>« # features/step_definitions/location_steps.rb:13 | |
And I should see «<location>« # features/step_definitions/location_steps.rb:13 | |
Examples: | |
| location | language | title | | |
| location 1 | en | Locations | | |
| location 2 | es | Locaciones | | |
Scenario Outline: : Create a new location # features/managing_locations.feature:18 | |
Given I am on the <language> site # features/step_definitions/location_steps.rb:5 | |
And I am on new location page # features/step_definitions/location_steps.rb:21 | |
And I fill in «<name>« with «<location>« # features/step_definitions/location_steps.rb:25 | |
And press «<button>« # features/step_definitions/location_steps.rb:29 | |
Then I should see «<location>« # features/step_definitions/location_steps.rb:13 | |
Examples: | |
| language | name | location | button | | |
| en | Name | location 1 | Create | | |
| es | Nombre | location 1 | crear | | |
Scenario Outline: Edit a location # features/managing_locations.feature:30 | |
Given I am on the <language> site # features/step_definitions/location_steps.rb:5 | |
And there is a location named «<location>« # features/step_definitions/location_steps.rb:1 | |
When I «<action>« the location «<field>« to «<new_name>« # features/step_definitions/location_steps.rb:33 | |
Then I should see «<new_name>« # features/step_definitions/location_steps.rb:13 | |
Examples: | |
| language | location | action | field | new_name | | |
| en | location 1 | Update | Name | location has changed | | |
| es | location 1 | Actualizar | Nombre | location has changed | | |
6 scenarios (6 passed) | |
28 steps (28 passed) | |
0m5.281s |
… и занавес.
В этой части мы копались в исходном коде рельсов. Это было не так страшно. Мы просмотрели файлы журналов, чтобы понять, что происходит. Они полны ценной информации.
Теперь все, что нам нужно сделать, это удалить местоположение, и у нас будет простое интернационализированное веб-приложение.
До тех пор.