我有rspec功能测试都失败了,因为我无法访问指定的路径。登录后,它们似乎都停留在根路径上。屏幕截图显示页面仍然保留在根路径上。测试步骤适用于浏览器,这意味着路由正确。有什么想法吗?
我收到以下测试错误消息:
失败/错误:page.evaluate_script(' jQuery.active')。零?
我的功能规范测试摘录:
describe 'follow users' do
let!(:user) { FactoryGirl.create(:user) }
let!(:other_user) { FactoryGirl.create(:friend) }
describe "Managing received friend request", js: true do
let!(:request) { Friendship.create(user_id: other_user.id, friend_id: user.id, accepted: false) }
before do
login_as(user, :scope => :user)
visit followers_path
end
it 'friend request disappear once user clicks accept' do
click_on "Accept"
wait_for_ajax
expect(current_path).to eq(followers_path)
expect(page).to have_css(".pending-requests", text: "You have 0 pending friend requests")
expect(page).to_not have_css(".pending-requests", text: other_user.name)
expect(page).to_not have_link("Accept")
expect(page).to_not have_link("Decline")
end
end
end
答案 0 :(得分:0)
尝试这种方法等待所有ajax请求完成:
def wait_for_ajax
Timeout.timeout(Capybara.default_wait_time) do
active = page.evaluate_script('jQuery.active')
until active == 0
active = page.evaluate_script('jQuery.active')
end
end
end
答案 1 :(得分:0)
这里的问题是您正在呼叫' wait_for_ajax'要么是在不包含jQuery的页面上,要么是在尚未加载jQuery的页面上。解决方案是停止使用wait_for_ajax
,而是按照设计使用Capybara期望/匹配器。实际上需要wait_for_ajax
的情况非常少,即使这样,它通常也是不良UI决策的标志(没有向用户指示正在发生的事情)。您也不应该将eq
匹配器与current_path
一起使用,并且应该使用Capybara提供的have_current_path
匹配器,因为它具有像所有Capybara提供的匹配器一样的等待/重试行为。
it 'friend request disappear once user clicks accept' do
click_on "Accept"
expect(page).to have_current_path(followers_path)
expect(page).to have_css(".pending-requests", text: "You have 0 pending friend requests")
expect(page).to_not have_css(".pending-requests", text: other_user.name)
expect(page).to_not have_link("Accept")
expect(page).to_not have_link("Decline")
end
如果这对您不起作用,则点击按钮实际上不会触发页面更改(检查测试日志),Capybara.default_max_wait_time
未设置为足够高您正在测试的硬件,您的login_as
语句实际上并没有登录用户(虽然我希望点击“接受”按钮失败),或者您的错误在应用
如果login_as
实际上没有登录,那么确保用于运行AUT的服务器在与测试相同的过程中运行,如果你是使用puma
意味着在输出中确保它没有说出来#{1}}。以群集模式运行。