2014-02-15 26 views
1

因此,我正在運行Michael Hartl Rails教程,並且在創建編輯頁面(代碼清單9.3末尾)後,我運行時遇到以下錯誤我的測試。據我所知,我定義了sign_in方法並使其在我的應用程序控制器中可用。不完全確定我的錯在哪裏,因爲他的教程說我的測試應該通過這一點。任何幫助表示讚賞。 (另外,請讓我知道如果我需要包括別的)Hartl Rails教程 - 在測試過程中遇到未定義的方法'sign_in'

Failures:

1) User pages edit page Failure/Error: sign_in user NoMethodError: undefined method sign_in' for #<RSpec::Core::ExampleGroup::Nested_2::Nested_4::Nested_1:0x00000108a92118> # ./spec/requests/user_pages_spec.rb:60:in block (3 levels) in '

2) User pages edit page Failure/Error: sign_in user NoMethodError: undefined method sign_in' for #<RSpec::Core::ExampleGroup::Nested_2::Nested_4::Nested_1:0x00000108820560> # ./spec/requests/user_pages_spec.rb:60:in block (3 levels) in '

3) User pages edit page Failure/Error: sign_in user NoMethodError: undefined method sign_in' for #<RSpec::Core::ExampleGroup::Nested_2::Nested_4::Nested_1:0x00000108846be8> # ./spec/requests/user_pages_spec.rb:60:in block (3 levels) in '

4) User pages edit with invalid information Failure/Error: sign_in user NoMethodError: undefined method sign_in' for #<RSpec::Core::ExampleGroup::Nested_2::Nested_4::Nested_2:0x00000103e6cd60> # ./spec/requests/user_pages_spec.rb:60:in block (3 levels) in '

Finished in 0.98841 seconds 23 examples, 4 failures

測試文檔:user_pages_spec.rb

require 'spec_helper' 

    describe "User pages" do 

    subject { page } 
    . 
    . 
    . 

    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 
    end 
end 

會議助手:sessions_helper.rb

module SessionsHelper 

    def sign_in(user) 
     remember_token = User.new_remember_token 
     cookies.permanent[:remember_token] = remember_token 
     user.update_attribute(:remember_token, User.encrypt(remember_token)) 
     self.current_user = user 
    end 

    def signed_in? 
     !current_user.nil? 
    end 

    def current_user=(user) 
     @current_user = user 
    end 

    def current_user 
     remember_token = User.encrypt(cookies[:remember_token]) 
     @current_user ||= User.find_by(remember_token: remember_token) 
    end 

    def sign_out 
     current_user.update_attribute(:remember_token, 
             User.encrypt(User.new_remember_token)) 
     cookies.delete(:remember_token) 
     self.current_user = nil 
    end 
end 

應用程序控制器:application_controller.rb

class ApplicationController < ActionController::Base 
    # Prevent CSRF attacks by raising an exception. 
    # For APIs, you may want to use :null_session instead. 
    protect_from_forgery with: :exception 
    include SessionsHelper 
end 
+0

確認一下...你指的教程從這個站點(http://ruby.railstutorial.org)? –

+0

確認。雖然理查德約翰遜已經成功地教育了我的解決方案。 – dhummel

回答

0

這是告訴你,sign_in不在測試範圍的方法,所以你不能像塊之前在使用它。這是一種控制器方法而不是測試方法。

最簡單的方法是創建一個簽名的規範助手方法,您可以在before塊的上下文中調用該方法,該方法爲需要簽入用戶的任何測試設置狀態。

做到這一點的一種方法是我有一個「user_signs_in」幫手,它使用水豚訪問登錄路徑,填寫正確的細節形式的登錄,然後按照重定向。

相關計算器問:

How do I simulate a login with RSpec?

+1

謝謝。在教程中進一步檢查之後,我發現他確實做了類似的事情,所以我必須錯過了解這一課。我很欣賞這個解釋,因爲我現在對它的理解現在好多了。謝謝。 – dhummel

相關問題