0

マイクロ投稿のページネーションのテストに関連する 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

何か案は?

UserPS私は副次的な質問があります-私は自分のモデルにリレーションを設定してい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
4

1 に答える 1