我一直在研究ruby on rails教程。我对这些东西全新。我在第9章并完全陷入困境。我希望有人可以帮我解密错误信息。到目前为止,我刚刚搜索过它们并将其弄清楚,但我认为了解如何破译错误消息以解决问题会更有价值。如果解释的时间太长或太麻烦,而不是我完全理解,如果没有人想要接受它。我无法找到在线帮助我自己的东西。
以下是我目前遇到的错误
1)在登录后尝试访问受保护页面时,AuthenticationPages会为非登录用户签署有效信息授权,以呈现所需的受保护页面
Failure/Error: click_button "Sign in"
Capybara::ElementNotFound:
Unable to find button "Sign in"
# ./spec/requests/authentication_pages_spec.rb:61:in `block (7 levels) in <top (required)>'
2)AuthenticationPages使用访问编辑页面的Users控制器中的非登录用户的有效信息授权登录
Failure/Error: it { should have_title('Sign in') }
expected #has_title?("Sign in") to return true, got false
# ./spec/requests/authentication_pages_spec.rb:76:in `block (8 levels) in <top (required)>'
3)AuthenticationPages使用有效的信息授权登录用户控制器中的非登录用户,因为用户访问用户#edit页面错误
Failure/Error: before { sign_in user, no_capybara: true }
NoMethodError:
undefined method `sign_in' for #<RSpec::Core::ExampleGroup::Nested_2::Nested_2::Nested_2::Nested_2::Nested_1::Nested_2::Nested_3::Nested_1:0xabbb9e4>
# ./spec/requests/authentication_pages_spec.rb:87:in `block (8 levels) in <top (required)>'
4)AuthenticationPages使用有效的信息授权为Users控制器中的非登录用户登录,因为错误的用户向User#update action提交了PATCH请求
Failure/Error: before { sign_in user, no_capybara: true }
NoMethodError:
undefined method `sign_in' for #<RSpec::Core::ExampleGroup::Nested_2::Nested_2::Nested_2::Nested_2::Nested_1::Nested_2::Nested_3::Nested_2:0xa82d354>
# ./spec/requests/authentication_pages_spec.rb:87:in `block (8 levels) in <top (required)>'
在6.6秒内完成 65个例子,4个失败
失败的例子:
rspec ./spec/requests/authentication_pages_spec.rb:66# AuthenticationPages使用有效的信息授权登录 尝试访问受保护页面后的非登录用户 登录应呈现所需的受保护页面
rspec ./spec/requests/authentication_pages_spec.rb:76# AuthenticationPages使用有效的信息授权登录 访问编辑页面的Users控制器中的非登录用户
rspec ./spec/requests/authentication_pages_spec.rb:91# AuthenticationPages使用有效的信息授权登录 用户控制器中的非登录用户作为错误的用户访问 用户#编辑页面
rspec ./spec/requests/authentication_pages_spec.rb:96# AuthenticationPages使用有效的信息授权登录 作为错误用户提交的用户控制器中的非登录用户 PATCH请求用户#更新操作
require 'spec_helper'
describe "AuthenticationPages" do
subject { page }
describe "signin page" do
before { visit signin_path }
it { should have_content('Sign in') }
it { should have_title('Sign in') }
end
describe "signin" do
before { visit signin_path }
describe "with invalid information" do
before { click_button "Sign in" }
it { should have_title('Sign in') }
it { should have_selector('div.alert.alert-error', text: 'Invalid') }
describe "after visiting another page" do
before { click_link "Home" }
it { should_not have_selector('div.alert.alert-error', text: 'Invalid') }
end
end
describe "with valid information" do
let(:user) { FactoryGirl.create(:user) }
before do
fill_in "Email", with: user.email.upcase
fill_in "Password", with: user.password
click_button "Sign in"
end
it { should have_title(user.name) }
it { should have_link('Profile', href: user_path(user)) }
it { should have_link('Settings', href: edit_user_path(user)) }
it { should have_link('Sign out', href: signout_path) }
it { should_not have_link('Sign in', href: signin_path) }
describe "followed by signout" do
before { click_link "Sign out" }
it { should have_link('Sign in') }
end
describe "authorization" do
describe "for non-signed-in users" do
let(:user) { FactoryGirl.create(:user) }
describe "when attempting to visit a protected page" do
before do
visit edit_user_path(user)
fill_in "Email", with: user.email
fill_in "Password", with: user.password
click_button "Sign in"
end
describe "after signing in" do
it "should render the desired protected page" do
expect(page).to have_title('Edit user')
end
end
end
describe "in the Users controller" do
describe "visiting the edit page" do
before { visit edit_user_path(user) }
it { should have_title('Sign in') }
end
describe "submitting to the update action" do
before { patch user_path(user) }
specify { expect(response).to redirect_to(signin_path) }
end
describe "as wrong user" do
let(:user) { FactoryGirl.create(:user) }
let(:wrong_user) { FactoryGirl.create(:user, email: "wrong@example.com") }
before { sign_in user, no_capybara: true }
describe "visiting Users#edit page" do
before { visit edit_user_path(wrong_user) }
it { should_not have_title(full_title('Edit user')) }
end
describe "submitting a PATCH request to the User#update action" do
before { patch user_path(wrong_user) }
specify { expect(response).to redirect_to(root_url) }
end
end
end
end
end
end
end
end
user_pages_spec.rb
require 'spec_helper'
describe "User pages" do
subject { page }
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
describe "with valid information" do
before do
fill_in "Name", with: "Example User"
fill_in "Email",with: "user@example.com"
fill_in "Password", with: "foobar"
fill_in "Confirmation", with: "foobar"
end
it "should create a new 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_title(user.name) }
it { should have_selector('div.alert.alert-success', text: 'Welcome') }
end
it "should create a user" do
expect { click_button submit }.to change(User, :count).by(1)
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") }
it { should have_link('change', href: 'http://gravatar.com/emails') }
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 eq new_name }
specify { expect(user.reload.email).to eq new_email }
end
end
end
end
end
end
我特别好奇“在'块(7级)中”是什么意思。这个级别上的某些内容是某些内容还是指其他内容?什么是'块'参考?
我似乎也无法理解我得到的水豚错误。它出现在第8章,走了,现在又回来了。当我把它拿出来的时候,页面上有按钮,所以我认为水豚只是找不到它。任何人都可以解释它是如何工作的吗?
'嵌套'是指什么?
任何人都知道一个好的网站打破了这个?我会非常乐意自己做这项工作,但我找不到。我真的很想能够自己解读这个,而不是谷歌搜索它,希望答案在某个地方,或者不得不依赖别人来解释它。
非常感谢你的时间和任何帮助。
答案 0 :(得分:1)
现在是我过度简化时Stack Overflow上的时间了。 (Google的'ruby block'可以在这里阅读更多内容。)Ruby中的一个块是一堆代码,它被传递给像参数这样的方法。例如,
[1,2,3].each{|n| puts n * n }
each
是方法(在数组[1,2,3]上调用),括号中的所有内容都是块。方法each
的工作方式是,它会调用枚举中的每个元素([1,2,3])并一次生成一个元素到代码块:
|the first element is 1| puts 1 * 1
|next is 2| puts 2 * 2
|etc| puts 3 * 3
也可以在do...end
之间编写一个块。 Ruby方法是使用括号,如果你可以将块放在一行上,而do...end
则另外 - 这就是你在规范中的方式。在您的规范中,每个地方都有do
和匹配的end
是一个块,在另一个内嵌套。这些方法更难注意到,因为RSpec使它看起来像自然语言,但每次在行的开头写describe
或it
都是方法调用。 (那么let
和before
以及subject
和expect
也是如此,在您的规范中使用单行块进行调用。)
所以消息'block(7 levels)'意味着你的错误嵌套在那么多块中:
describe "AuthenticationPages" do #starts the first block
...
describe "signup" do #starts the second
等等。
现在,您的错误消息。第一个和第二个基本上是告诉你同样的事情 - 你访问edit_user_path(user)
并且你没有在页面标题中看到“登录”按钮或“登录”。检查log / test.log文件 - 访问该页面时会发生什么?它是重定向到登录页面吗?它应该是,但它看起来不是。
另外两条错误消息说的完全一样 - 规范不知道sign_in
的含义。你需要在RSpec可以找到它的地方定义一个方法 - 在规范本身,或在规范顶部你require
的spec_helper文件,或在某个文件本身{{1在spec_helper里面。
最后,我认为Hartl是对的 - 你最好用谷歌的错误消息和堆栈痕迹,当你找不到你想要的东西时问你,你会更好地随时间计算出你自己的东西
答案 1 :(得分:1)
Re:sign_in - 在第9.1.1节,清单9.6(在Rails 4版本的书中)中,sign_in函数被添加到spec / support / utilities.rb中。
我得到了同样的错误,因为我在utilities.rb中的函数是“signin”而没有下划线。一旦我添加了下划线(并将另一个引用更改为匹配的相同函数),测试就变为绿色。