[英]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.