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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Rspec功能测试:无法访问路径相关的知识,希望对你有一定的参考价值。

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

这里的问题是你在不包含jQuery的页面上或者在尚未加载的时候调用'wait_for_ajax'。解决方案是停止使用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这意味着确保在输出中它没有说出来在群集模式下运行。

另一答案

尝试这种方法等待所有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

以上是关于Rspec功能测试:无法访问路径的主要内容,如果未能解决你的问题,请参考以下文章

rake 规范不使用 rails 环境

如何为 rspec 包含/设置可见的辅助方法?

会话在某些 rspec 文件中可用,而在其他文件中不可用。怎么会?

无法在 rspec 中执行任何测试用例

如何从 Rspec 输出禁用 http 日志?

无法在 Ubuntu 上使用 rspec 和 elasticsearch-extensions 进行测试