Rspec功能测试:无法访问路径

时间:2017-12-15 15:45:32

标签: ruby-on-rails rspec capybara

我有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

2 个答案:

答案 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

取自:Wait for ajax with capybara 2.0

答案 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}}。以群集模式运行。