マイクロ投稿のページネーションのテストに関連する Rails チュートリアルの第 10 章の演習を行っていますが、以下のようにbefore(:all)
およびafter(:all)
を使用してテストを実行すると、テストが中断する理由がわかりません。に変更するだけでもbefore(:each)
動作するので、インスタンス変数ではありません。(インスタンスを使用せずに動作させることもできますが、user
提供されたを構築しますlet
)
私はこれを適切な方法でやろうとしています。1 回実行する (つまり:all
) のは、これには適しているようです。私は何が欠けていますか?
私は試しましたstop_and_open_page
- を使用するとマイクロポストは表示されませ:all
ん:each
。ただし、コンソールでインスタンス変数またはuser
(を使用してそのようにしようとする場合let
)のいずれかを調べるとbinding.pry
、指定した場合でも、常にマイクロポストがあります:all
。
使用時にアソシエーションを読み込んでいないことが関係している:all
と思いますが、サンプルサイトと使用しない場合のテストでは別の方法で動作するため、理由がわかりません:all
。
何か案は?
User
PS私は副次的な質問があります-私は自分のモデルにリレーションを設定していhas_many :microposts, dependent: :destroy
ますが、以下のインスタンス変数メソッドでこれらのテストを行う場合、明示的delete_all
にマイクロポストを呼び出す必要があります。そうしないと、実行後にテストデータベースに残ります(ユーザーが削除されても)。そこに明らかな何かが欠けていますか、それともユーザーがFactory Girlを介して作成されたときにカスケード破壊が機能しませんか?
更新: @Jesper のおかげで、関連するマイクロポストが after(:all) で削除されない理由がわかりました。それを反映するようにコードが更新されました。
subject { page }
let(:user) { FactoryGirl.create(:user) }
before { valid_signin user }
...
describe "micropost pagination" do
before(:all) do
@user_with_many_posts = FactoryGirl.create(:user, email: "manyposts@example.com")
@user_with_many_posts.save
31.times { FactoryGirl.create(:micropost, user: @user_with_many_posts) }
valid_signin @user_with_many_posts
visit root_path
end
after(:all) do
@user_with_many_posts.destroy
end
it { should have_selector('div.pagination') }
it "should list each micropost" do
@user_with_many_posts.microposts.paginate(page: 1).each do |mp|
expect(page).to have_selector('li', text: mp.content)
end
end
end