2012-04-06 4 views
1

ないと言っている:リンクがブラウザに表示されますが、テストでは、それがリスト内のいずれかの記事は、ログインしているユーザーに属している場合編集リンクをチェックし、私はRSpecのテストを持って

let(:user) { Fabricate(:user) } 
before do 
    visit new_user_session_path 
    fill_in 'Email', :with => user.email 
    fill_in 'Password', :with => user.password 
    click_button 'Sign in' 
end 

describe 'when user has a self-authored article' do 
    let(:article) { Fabricate(:article, :author_id => user.id) } 
    before { visit articles_path } 
    it { should have_link('Edit article', :href => edit_article_path(article)) } 
end 

これらの

# articles/new.html.erb 
<% provide(:title, 'Articles') %> 
<h1>Articles</h1> 
<% if user_signed_in? %> 
    <%= link_to 'Post article', new_article_path %> 
<% end %> 

<%= render @articles %> 

<%= will_paginate %> 

これは、それがテストしていること、特定のビューがある:それはテストのビューがある

# articles/_article.html.erb 
<% if user_signed_in? %> 
    <% if current_user.id == article.author.id %> 
    <%= link_to 'Edit article', edit_article_path(article) %> 
    <% end %> 
<% end %> 

私がテストを実行

、I次のエラーメッセージが表示されます。

Failure/Error: it { should have_link('Edit article', :href => edit_article_path(article)) }

expected link "Edit article" to return something 

ブラウザがテストが正しいことを確認しましたが、リンクが意図したとおりに表示されているようです。どこで私は間違えましたか?テストパスを作成するにはどうすればよいですか?

答えて

0

私はそれを理解しました。 letの仕組みを誤解していたことが判明しました。私はそれがbeforeの前に実行されると思ったが、私は間違っていた。 beforeブロック内にオブジェクトを作成することで問題を解決しました。

describe 'when user has a self-authored article' do 
    before do 
     @article = Fabricate(:article, :author_id => user.id) 
     visit articles_path 
    end 
    it { should have_link('Edit article', :href => edit_article_path(@article)) } 
    end 
end 
+1

'let'の代わりに' let! 'を使って、期待した動作を強制することができます。 – Thilo

+0

私はそれを知らなかった。 TIL –

2

私はlet(:article) { Fabricate(:user, :author_id => user.id) }が記事ではなくユーザーを作成していると推測しています。

+0

ああ。ごめんなさい。それはタイプミスでした。私のコードでは、記事です。 –