1

RailsTutorial.orgを終了した後、アプリケーションを i18n することにしましたが、突然、次のようにテストが失敗し始めました。

失敗:

1) ユーザーページのインデックス 失敗/エラー: sign_in user Capybara::ElementNotFound: Unable to find field "Email" # ./spec/support/utilities.rb:5:insign_in' # ./spec/requests/user_pages_spec.rb:11:inブロック (3 レベル)

私が行った唯一の変更は、

ルート.rb

SampleApp::Application.routes.draw do
  scope '(:locale)' do
    resources :users
    resources :sessions, only: [:new, :create, :destroy]
    root to: 'static_pages#home'
    match '/signup',    to: 'users#new',              via: 'get'
    match '/signin',    to: 'sessions#new',           via: 'get'
    match '/signout',   to: 'sessions#destroy',       via: 'delete'
    match '/help',      to: 'static_pages#help',      via: 'get'
    match '/about',     to: 'static_pages#about',     via: 'get'
    match '/contact',   to: 'static_pages#contact',   via: 'get'
  end

そして config/initializers/i18n.rb

I18n.default_locale = :en

LANGUAGES = [
  ['English',               'en'],
  ['Portuguese',        'pt']
]

i18n の前は、ルートは次のようになっていました。

users_path  GET     /users(.:format)    users#index
    POST    /users(.:format)    users#create
new_user_path   GET     /users/new(.:format)    users#new
edit_user_path  GET     /users/:id/edit(.:format)   users#edit
user_path   GET     /users/:id(.:format)    users#show
    PATCH   /users/:id(.:format)    users#update
    PUT     /users/:id(.:format)    users#update
    DELETE  /users/:id(.:format)    users#destroy
sessions_path   POST    /sessions(.:format)     sessions#create
new_session_path    GET     /sessions/new(.:format)     sessions#new
session_path    DELETE  /sessions/:id(.:format)     sessions#destroy
root_path   GET     /   static_pages#home
signup_path     GET     /signup(.:format)   users#new
signin_path     GET     /signin(.:format)   sessions#new
signout_path    DELETE  /signout(.:format)  sessions#destroy
help_path   GET     /help(.:format)     static_pages#help
about_path  GET     /about(.:format)    static_pages#about
contact_path    GET     /contact(.:format)  static_pages#contact 

そしていま、

users_path  GET     (/:locale)/users(.:format)  users#index
    POST    (/:locale)/users(.:format)  users#create
new_user_path   GET     (/:locale)/users/new(.:format)  users#new
edit_user_path  GET     (/:locale)/users/:id/edit(.:format)     users#edit
user_path   GET     (/:locale)/users/:id(.:format)  users#show
    PATCH   (/:locale)/users/:id(.:format)  users#update
    PUT     (/:locale)/users/:id(.:format)  users#update
    DELETE  (/:locale)/users/:id(.:format)  users#destroy
sessions_path   POST    (/:locale)/sessions(.:format)   sessions#create
new_session_path    GET     (/:locale)/sessions/new(.:format)   sessions#new
session_path    DELETE  (/:locale)/sessions/:id(.:format)   sessions#destroy
root_path   GET     /(:locale)(.:format)    static_pages#home
signup_path     GET     (/:locale)/signup(.:format)     users#new
signin_path     GET     (/:locale)/signin(.:format)     sessions#new
signout_path    DELETE  (/:locale)/signout(.:format)    sessions#destroy
help_path   GET     (/:locale)/help(.:format)   static_pages#help
about_path  GET     (/:locale)/about(.:format)  static_pages#about
contact_path    GET     (/:locale)/contact(.:format)    static_pages#contact 

user_pages_spec.rb

require 'spec_helper'

describe "User pages" do

    subject { page }

    describe "index" do
        let(:user) { FactoryGirl.create(:user) }

        before (:each) do
            sign_in user
            visit users_path
        end

        it { should have_title('All users') }
        it { should have_content('All users') }

        describe "pagination" do
            before(:all) { 30.times { FactoryGirl.create(:user) } }
            after(:all) { User.delete_all }

            it { should have_selector('div.pagination') }

            it "should list each user" do
                User.paginate(page: 1).each do |user|
                    expect(page).to have_selector('li', text: user.name)
                end
            end
        end

        describe "delete links" do

            it { should_not have_link('delete') }

            describe "as an admin user" do
                let(:admin) { FactoryGirl.create(:admin) }
                before do
                  sign_in admin
                  visit users_path
                end

                it { should have_link('delete', href: user_path(User.first)) }
                it "should be able to delete another user" do
                    expect{ click_link('delete') }.to change(User, :count).by(-1)
                end
                it { should_not have_link('delete', href: user_path(admin)) }
            end
        end
    end

    describe "profile page" do
        let(:user) { FactoryGirl.create(:user) }
        before { visit user_path(user) }

        it { should have_content(user.name) }
        it { should have_title(user.name) }
    end

    describe "signup page" do
        before { visit signup_path }

        it { should have_content('Sign up') }
        it { should have_title(full_title('Sign up')) }
    end

    describe "signup" do

        before { visit signup_path }

        let(:submit) { "Create my account" }

        describe "with invalid information" do
            it "should not create a user" do
                expect { click_button submit }.not_to change(User, :count)              
            end

            describe "after submission" do
                before { click_button submit }

                it { should have_title('Sign up') }
                it { should have_content('error') }
            end
        end

        describe "with valid information" do
            before do
              fill_in "Name",           with: "Example User"
              fill_in "Email",          with: "user@example.com"
              fill_in "Password",       with: "password"
              fill_in "Confirm Password",   with: "password"
            end

            it "should create a user" do
                expect { click_button submit }.to change(User, :count).by(1)
            end

            describe "after saving the user" do
                before { click_button submit }
                let(:user) { User.find_by(email: 'user@example.com') }

                it { should have_link('Sign out') }
                it { should have_title(user.name) }
                it { should have_selector('div.alert.alert-success', text: 'Welcome') }
            end
        end
    end

    describe "edit" do
        let(:user) { FactoryGirl.create(:user) }
        before do
          sign_in user
          visit edit_user_path(user)
        end

        describe "page" do
            it { should have_content("Update your profile") }
            it { should have_title("Edit user") }
        end

        describe "with invalid information" do
            before { click_button "Save changes" }

            it { should have_content('error') }
        end

        describe "with valid information" do
            let(:new_name) { "New Name" }
            let(:new_email) { "new@example.com" }
            before do
              fill_in "Name",               with: new_name
              fill_in "Email",              with: new_email
              fill_in "Password",           with: user.password
              fill_in "Confirm Password",   with: user.password
              click_button "Save changes"
            end

            it { should have_title(new_name) }
            it { should have_selector('div.alert.alert-success') }
            it { should have_link('Sign out', href: signout_path) }
            specify { expect(user.reload.name).to eql(new_name) }
            specify { expect(user.reload.email).to eql(new_email) }
        end

        describe "forbidden attributes" do
            let(:params) do
                { user: { admin: true, password: user.password, password_confirmation: user.password } }
            end
            before { patch user_path(user), params }
            specify { expect(user.reload).not_to be_admin }
        end
    end
end

ユーティリティ.rb

include ApplicationHelper

def sign_in(user)
    visit signin_path
    fill_in "Email",        with: user.email
    fill_in "Password",     with: user.password
    click_button "Sign in"
    #Sign in when not using Capybara as well.
    cookies[:remember_token] = user.remember_token
end

どなたか初心者向けのコツを教えてください。すべてのサポートに感謝します。

4

1 に答える 1

2

すべてのルートに a を含めるようにスコープを設定する場合は、パスをテストするときlocaleに a をパスに渡す必要がありますlocale( への新しい出力でわかるようにrake routes、 a:localeが期待されます)。 、言う、、visit users_pathあなたは置くでしょう
visit users_path(locale)localeのリストから取得しますI18n.available_locales
fill_in "Email"また、フィールドの検索に使用している文字列を i18n に相当する文字列に変更する必要があります。fill_in I18n.t('sessions.new.email')

サンプル アプリを i18n 化したので、ここに私のuser_pages_spec.rbを示します。これにより、おそらくどのような変更を行う必要があるかがわかります。

于 2013-04-06T00:56:15.623 に答える