Capybara:测试页面创建对象的当前路径



创建新对象后应重定向到动作显示。如何检查当前路径?

feature 'add lost pet' do
  given(:data) {attributes_for(:lost_pet)}
  background do
    visit  root_path
    click_on 'Register new lost pet'
  end
  scenario 'add new lost pet with valid data' do
    within '#new_lost_pet' do
      fill_in 'Name', with: data[:name]
      fill_in 'Type', with: data[:type]
      fill_in 'Breed', with: data[:breed]
      fill_in 'Gender', with: data[:gender]
      fill_in 'Size', with: data[:size]
      fill_in 'Colour', with: data[:colour]
      fill_in 'Age', with: data[:age]
      fill_in 'Age unit', with: data[:age_unit]
      fill_in 'Description', with: data[:description]
      fill_in 'Collar description', with: data[:collar_description]
      check 'Desexed', :checked
      check 'Microchipped', :checked
      fill_in 'Microchip number', with: data[:microchipped_number]
      select '2015', from: "lost_pet[date_missing(1i)]"
      select 'October', from: 'lost_pet[date_missing(2i)]'
      select '10', from: 'lost_pet[date_missing(3i)]'
      fill_in 'Rewald', with: data[:rewald]
      fill_in 'Image', with: data[:image]
      fill_in 'Adress lost', with: data[:adress_lost]
      click_on 'Create'
    end  
    expect(current_path).to eq lost_pet_path(????)

  end

对于lost_pet_path,我需要id,但是我如何创建id?或者在Capybara中如何检查路径?

expect(current_path).to eq ...

没有使用Capybara的等待行为——这意味着由于click_on是异步的(不等待屏幕上的任何东西,也不等待提交完成),您的测试可能非常不可靠。你最好使用

expect(page).to have_current_path(expected_path)

,因为这将使用Capybara的等待行为,同时检查预期的路径。

最重要的是,你有一个问题,即在click_on执行(异步)后,LostPet对象尚未创建,因此调用LostPet。最后,它很可能返回nil。这里有几个选项

等待一些将要出现在页面上的文本

expect(page).to have_text('Lost Pet created') # shows in a flash message, or header on the show page, etc
# since you know the show page is visible now you can query for the last LostPet created
expect(page).to have_current_path(lost_pet_path(LostPet.last)) 

或者,使用带有have_current_path的regex选项,不用担心验证url的实际id

expect(page).to have_current_path(/lost_pet/[0-9]+/) # match the regex to whatever your urls actually are

或者类似的

由于创建的记录是数据库中最近的记录,因此可以使用MyActiveRecordModel.last

lost_pet = LostPet.last
expect(current_path).to eq lost_pet_path(lost_pet)

最新更新