2013-03-29 115 views
0

所以我在Michael Hartl(偉大的)RoR教程的chapter 11。 完成第10章之後,我決定將micropost表單添加到用戶的個人資料頁面,以便您可以從那裏發帖,而不僅僅是從主頁。Michael Hartl的Ruby on rails教程 - Rspec測試失敗 - 未定義的方法`microposts'

我設法使它工作得很好,但它在某種程度上崩潰我的測試套件...

下面是錯誤信息,我從Rspec的獲得,爲我所有的User_pages_spec.rb個人資料頁面測試:

UserPages profile page 
    Failure/Error: before { visit user_path(user) } 
    NoMethodError: 
     undefined method `microposts' for nil:NilClass 
    # ./app/controllers/users_controller.rb:17:in `show' 
    # ./spec/requests/user_pages_spec.rb:60:in `block (3 levels) in <top (required)>' 

這裏是我的測試文件:

describe "profile page" do 
    let(:user) { FactoryGirl.create(:user) } 
    let!(:m1) { FactoryGirl.create(:micropost, user: user, content: "Foo") } 
    let!(:m2) { FactoryGirl.create(:micropost, user: user, content: "Bar") } 

    before { visit user_path(user) } 

    it { should have_selector('h1', text: user.name) } 
    it { should have_selector('title', text: user.name) } 

    describe "microposts" do 
     it { should have_content(m1.content) } 
     it { should have_content(m2.content) } 
     it { should have_content(user.microposts.count) } 
    end 
    end 

我確實有微柱法在我的用戶模型:

has_many :microposts, dependent: :destroy 

,這裏是我的用戶展示視圖中添加代碼:

<% if current_user?(@user) %> 
     <section> 
     <%= render 'shared/micropost_form' %> 
     </section> 
    <% end %> 

我還添加變量show動作在UserController中的@microposts:

def show 
    @user = User.find(params[:id]) 
    @microposts = @user.microposts.paginate(page: params[:page]) 
    @micropost = current_user.microposts.build 
end 

所以當一切在開發和生產中似乎工作得很好,我不明白爲什麼我的測試不會通過...他們通過之前我在用戶配置文件頁面中添加微博表單...

如果有人能解釋問題所在,我將非常感謝幫助!

回答

1

從您的測試規格我認爲你正在訪問user_path,但沒有登錄任何用戶。因此,在執行規範期間current_user爲零。你可能會需要像

before do 
    sign_in(user) 
    visit user_path(user) 
end 

其中sign_in是駐留(在我的版本的教程)在規格/ utilities.rb功能。它應該在以前的幾章中出現。

+0

修好了!非常感謝 :) –

0

我不知道rspec,但錯誤消息表明nil沒有方法microposts,這意味着用戶返回nil而不是用戶實例。

相關問題