2014-05-25 1 views
0

레일 튜토리얼의 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 개의 오류는 같은 유형의 것입니다. 여기

은 사양 오류를 일으키는 :

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 

모델 (사용자의 코드 : 여기

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)입니다. 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+\-.][email protected][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 방법과 관련하여 문제가 있었지만 miraculously disappeared. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

답변

0

필자는이 경우에 관찰 한 이상한 테스트 결과와 이전 경우 (Failure/Error: sign_in user undefined method `sign_in', Rails named route not recognized)에서 필자를 찾았습니다. 문제는 레일스가 기본적으로 테스트 사이에 캐시를 지우지 않는 것 같습니다. 사실, 정말 무섭습니다. 테스트 결과를 믿을 수는없는 것 같습니다. 레일이 불평하고 테스트를 다시 실행하는 방법을 주석으로 알았습니다. rspec은 단순히 캐시 된 버전의 파일로 작업하고 있었기 때문에 내가하고있는 변경 사항을 무시한 오류가 지속되었습니다. 따라서 테스트가 통과 되더라도 그들이 실제로 수행하는지 확신 할 수 없습니다. 이것은 정말로 기괴합니다. 검색 좀 문제를 실현 후 레일을 강제로 캐시를 청소하는 방법을 발견 - 여기에 jaustin의 대답을 확인하십시오 : is Rails.cache purged between tests?

+0

또한 가드 폴링 도움이 될 수 있습니다 - http://stackoverflow.com/questions/11766511/tests- 윈도우에서 가드 앤리스 (rspec-on-windows)를 사용하여 파일 변경하지 않고 실행 – Nick