Search code examples
ruby-on-railsrubyrspec-rails

In views tests, when to use before(:all)?


I'm writing some views tests in an application and my tests expects something like:

describe 'form' do
  it 'has a search form' do
    render
    expect(rendered).to have_selector 'form[id=mock_search]'
  end
  it 'has a name filter' do
    render
    expect(rendered).to have_selector 'label[for=q_name_cont]', text: 'Nome do simulado'
    expect(rendered).to have_selector 'input[id=q_name_cont]'
  end
  it 'has a submit button' do
    render
    expect(rendered).to have_selector 'input[type=submit][value="Buscar"][name=commit]'
  end
  it 'has a reset button' do
    render
    expect(rendered).to have_selector 'input[type=submit][value="Limpar filtros"]'
  end
end

But I have and before(:each) that iterates too many requests on application making my tests spend 25 seconds to run. I've changed to before(:all) and then become to 4 seconds.

  • Should I still use before(:each)?
  • Why before(:all) were not recommended?

EDIT: My before iterations:

before(:each) do
  @school = build(:school)
  @teacher = build(:teacher)
  build_list(:mock_with_proccessed_statistics, 2, school: @school, teacher: @teacher)
  @mocks = Mock.page(nil)
  @q = Mock.ransack
  allow(view).to receive(:current_school).and_return(@school)
  allow(view).to receive(:format_date) { |date, format| date.strftime(format) }
end

Solution

  • describe 'form' do
      # 
      #let! will create create instance variable school 
      #inside your test case and assign your school build. Different between 
      #let! and let is: let! create before every task. You won't need it to put 
      #on before block and let doesn't do that you have to call it explicitly to 
      #create that mock and get values..   
      let!(:school) { build(:school) }
      let!(:teacher) { build(:teacher) }
      let!(:statistics) { build_list(:mock_with_proccessed_statistics, 2, school: @school, teacher: @teacher) }
      let!(:mocks) { Mock.page(nil) }
    
      subject { render }
    
      it 'has a search form' do
        expect{ subject }.to have_selector 'form[id=mock_search]'
      end
    
      it 'has a name filter' do
        expect{ subject }.to have_selector 'label[for=q_name_cont]', text: 'Nome do simulado'
        expect{ subject }.to have_selector 'input[id=q_name_cont]'
      end
    end