简体   繁体   English

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

[英]Capybara: Test current path to page created object

After creating new object should redirect to action show. 创建新对象后应重定向到动作节目。 How me check current path? 我如何检查当前路径?

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

For lost_pet_path i need id, but how me create id? 对于lost_pet_path我需要id,但是我如何创建id? Or how better check path in Capybara? 或者如何更好地检查Capybara的路径?

expect(current_path).to eq ...

doesn't use Capybara's waiting behavior - which means since click_on is asynchronous (isn't waiting for anything on screen, or for the submit to complete) your test may be very flaky. 不使用Capybara的等待行为 - 这意味着由于click_on是异步的(不等待屏幕上的任何内容,或者提交完成),您的测试可能非常不稳定。 You're much better off using 你用得好多了

expect(page).to have_current_path(expected_path)

since that will use Capybara's waiting behavior while checking for the expected path. 因为那将在检查预期路径时使用Capybara的等待行为。

On top of that you have the issue that the LostPet object isn't yet created right after the click_on executes (asynchronous) so calling LostPet.last then will most likely return nil. 最重要的是你有一个问题,就是在click_on执行(异步)之后还没有创建LostPet对象,因此调用LostPet.last很可能会返回nil。 You have a couple of options here 你有几个选择

Wait for some text thats going to appear on the page 等待页面上出现的一些文本

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)) 

or, use the regex option with have_current_path and don't worry about verifying the actual id of the url 或者,使用带有have_current_path的正则表达式选项,并且不必担心验证URL的实际ID

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

or something like that 或类似的东西

Since the created record is the most recent one in the database, MyActiveRecordModel.last can be used. 由于创建的记录是数据库中最新的记录,因此可以使用MyActiveRecordModel.last

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM