2013-04-05 52 views
1

完成RailsTutorial.org后,我已经决定国际化我的应用程序和suddently我的测试开始与以下失败,RSpec的测试之后,应用国际化破

失败:

1) User pages index Failure/Error: sign_in user Capybara::ElementNotFound: Unable to find field "Email" # ./spec/support/utilities.rb:5:in sign_in' # ./spec/requests/user_pages_spec.rb:11:in block (3 levels)

只有我已经在那里的变化,

的routes.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 

和CO nfig /初始化/ i18n.rb

I18n.default_locale = :en 

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

之前,国际化的路径看起来像下面

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: "[email protected]" 
       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: '[email protected]') } 

       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) { "[email protected]" } 
      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 

utilities.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 

是否有人可以为初学者提供一些提示? 感谢您的支持。

+0

嗨米格尔,你明白错误信息在说什么吗?你能在这里粘贴你的测试吗? – 2013-04-05 19:39:23

+0

是找不到字段电子邮件。 – 2013-04-05 21:01:26

回答

2

如果你打算范围的所有路由,以包括locale,你需要在locale传递到你的路,当你测试他们(你可以在新的输出看到rake routes,一个:locale是预计),所以你会放在哪里,比如说,visit users_path,你会把
visit users_path(locale)。您会从I18n.available_locales列表中获得您的locale。您还需要改变您使用找到自己的国际化等同如田弦
fill_in "Email"成为fill_in I18n.t('sessions.new.email')

我的i18n-美化版我的示例应用程序,所以here's my user_pages_spec.rb这将有望给你一个想法是什么您可能需要做出的改变。

+0

就是这样。感谢保罗在这方面的帮助。 – 2013-04-06 07:54:56