Question

This is one of my spec helpers:

def remove_slides_from_page(to_delete_array, to_leave_array, button_name)
  to_delete_array.map { |slide| 
    page.check("slide_select_#{slide.id}")
  } 

  click_button(button_name) # <- I would like to pass this command(s) as an argument

  to_leave_array.map { |slide|
    expect(page).to have_selector("tr#slide_#{slide.id}")
    expect(page).to have_field("slide_select_#{slide.id}")
    expect(page).to have_field("slide_delete_#{slide.id}", visible: false)
    expect(page).to have_field("slide_move_#{slide.id}", visible: false)
  }
  to_delete_array.map {|slide|
    expect(page).to_not have_selector("tr#slide_#{slide.id}")
    expect(page).to_not have_field("slide_select_#{slide.id}")
    expect(page).to_not have_field("slide_delete_#{slide.id}")
    expect(page).to_not have_field("slide_move_#{slide.id}")
  }        
end

Instead of calling it remove_slides_from_page(@foo, @bar, "baz") I wish to be able to pass click_button("baz") as its last argument (lambda?) somehow. I want to ask you for help as I have no clue how to make it in Ruby.

Was it helpful?

Solution

Use yield:

def remove_slides_from_page(to_delete_array, to_leave_array)
  to_delete_array.map { |slide| 
    page.check("slide_select_#{slide.id}")
  } 

  yield

  to_leave_array.map { |slide|
    expect(page).to have_selector("tr#slide_#{slide.id}")
    expect(page).to have_field("slide_select_#{slide.id}")
    expect(page).to have_field("slide_delete_#{slide.id}", visible: false)
    expect(page).to have_field("slide_move_#{slide.id}", visible: false)
  }
  to_delete_array.map {|slide|
    expect(page).to_not have_selector("tr#slide_#{slide.id}")
    expect(page).to_not have_field("slide_select_#{slide.id}")
    expect(page).to_not have_field("slide_delete_#{slide.id}")
    expect(page).to_not have_field("slide_move_#{slide.id}")
  }        
end

remove_slides_from_page(to_delete_array, to_leace_array) { click_button('baz') }
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top