我被困在(再次!)Rails教程的第9章(这次在9.2.2节中)。 我正进入(状态
bundle exec rspec spec/
................................FFF........................
Failures:
1) Authentication authorization as wrong user submitting a GET request to the Users#edit action
Failure/Error: before {sign_in user, no_capybara: true}
NoMethodError:
undefined method `new_remember_token' for #<User:0x007f8181815448>
# ./spec/support/utilities.rb:13:in `sign_in'
# ./spec/requests/authentication_pages_spec.rb:71:in `block (4 levels) in <top (required)>'
其他2个错误属于同一类型。
这是导致错误的规范:
describe "as wrong user" do
let(:user) {FactoryGirl.create(:user)}
let(:wrong_user) {FactoryGirl.create(:user, email: "[email protected]")}
before {sign_in user, no_capybara: true}
describe "submitting a GET request to the Users#edit action" do
before {get edit_user_path(wrong_user)}
specify { expect(response.body).not_to match(full_title('Edit user'))}
specify { expect(response).to redirect_to(root_url)}
end
describe "submitting a PATCH request to the Users#update action" do
before { patch user_path(wrong_user)}
specify { expect(response).to redirect_to(root_url)}
end
end
这是错误消息抱怨的方法(utilities.rb):
def sign_in (user, options={})
if options[:no_capybara]
# Sign in when not using Capybara
remember_token = User.new_remember_token
cookies[:remember_token]
user.update_attribute(:remember_token, User.digest(remember_token))
else
visit signin_path
fill_in "Email", with: user.email
fill_in "Password", with: user.password
click_button "Sign in"
end
end
该模型的代码(User.rb)在这里:
class User < ActiveRecord::Base
before_save { self.email = email.downcase}
before_create :create_remember_token
validates :name, presence: true, length: { maximum: 50 }
VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
validates :email, presence: true, format: { with: VALID_EMAIL_REGEX }, uniqueness: { case_sensitive: false }
validates :password, length: {minimum: 6}
has_secure_password
def User.new_remember_token
SecureRandom.urlsafe_base64
end
def User.digest(token)
Digest::SHA1.hexdigest(token.to_s)
end
private
def create_remember_token
self.remember_token = User.digest(User.new_remember_token)
end
end
我以前在使用sign_in方法时遇到麻烦,但是奇迹般地消失了 。 我究竟做错了什么?
我终于找到了这种情况下我一直观察到的不稳定测试结果的罪魁祸首,而且很有可能在以前的场合( 失败/错误:sign_in用户未定义方法`sign_in' , 未识别命名为route的Rails )。 问题似乎是在默认情况下,rails不会在测试之间清除缓存。 实际上,这完全是令人恐惧的。 看来您真的不能相信测试结果。 通过注释掉Rails抱怨的方法并重新运行测试,我意识到了这一点。 错误仍然存在,这意味着一件事-rspec只是在处理文件的某些缓存版本,因此无视我所做的更改。 因此,即使测试通过了,您也无法确定它们是否确实通过了测试。 这真的很奇怪。 在通过一些谷歌搜索意识到问题之后,我发现了如何强制Rails清理缓存-在这里检查jaustin的答案:两次测试之间是否清除了Rails.cache?