完成RailsTutorial.org后,我决定申请我的申请,突然之间我的考试开始失败了,
故障:
1)用户页面索引 失败/错误:sign_in用户 水豚:: ElementNotFound: 无法找到字段“电子邮件” #./spec/support/utilities.rb:5:in
sign_in' # ./spec/requests/user_pages_spec.rb:11:in
块(3级)
我所做的唯一改变,
的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
和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
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 :(得分:2)
如果您要将所有路线的范围都包含在locale
范围内,那么在测试它们时,您需要将locale
传递到路径中(正如您在新的路径中看到的那样)输出到rake routes
,预计会有:locale
,所以你可以放置visit users_path
,你会把
visit users_path(locale)
。您可以从locale
列表中获取I18n.available_locales
。您还需要更改您正在使用的字符串以查找其等效的字段,例如
fill_in "Email"
变为fill_in I18n.t('sessions.new.email')
我对我的示例应用程序进行了测试,所以here's my user_pages_spec.rb希望能够让您知道您可能需要做出哪些更改。