【问题标题】:Rspec + Capybara webkit: Not directed to path stated in test, instead root path syntax detectedRspec + Capybara webkit:未定向到测试中所述的路径,而是检测到根路径语法
【发布时间】:2017-11-01 14:55:18
【问题描述】:

我正在运行访问路径并在该页面上创建新对话的 rspec 测试。但是,即使我已明确说明visit conversations_path,我也无法理解为什么会出现以下错误。错误信息中写的link_to语句是在我的根路径下找到的。

当我从根路径中删除 link_to 代码时,测试通过。

conversation_spec.rb

describe "Conversation" do

    let!(:user) { FactoryGirl.create(:user) }
    let!(:other_user) { FactoryGirl.create(:friend) }

    before do
        login_as(user, :scope => :user)
    end

    describe 'index' do

        before do
          visit conversations_path
        end

        it 'can be reached successfully' do
            expect(page.status_code).to eq(200)
        end

        it "create a new conversation", **js: true** do
            visit conversations_path
            expect(current_path).to eq(conversations_path)
            click_on "Compose"
            expect(page).to have_css('.new_message_head')

        end

    end

失败:

 1) Conversation index create a new conversation
     Failure/Error: <h4><%= link_to featured_article.title, article_path(featured_article) %></h4>

     ActionView::Template::Error:
       undefined method `title' for nil:NilClass

【问题讨论】:

    标签: rspec capybara capybara-webkit


    【解决方案1】:

    显示的具体错误是因为 featured_article 为 nil,很可能是因为您还没有为测试创建任何文章。至于为什么它会进入根路径而不是对话,如果没有看到对话控制器和/或test.log 的相关部分,就无法肯定地说。不过,我对发生的事情有 2 种猜测。

    1. 对话路径要求文章存在,因此它知道要显示的内容,并且您没有在测试数据中创建任何内容,因此它会重定向到根目录

    2. 您连续两次调用 visit 而未验证它是否已完成。使用之前的块,您的测试归结为

      login_as(user, :scope => :user) 访问对话路径 访问对话路径 ...

    由于visit 不能保证在返回之前等待其操作完成(司机会尽力而为,但并非总是可能),因此第二次访问请求可能在第一次返回之前发生。假设您使用的login_as 是设计/监护人测试模式版本,它通过设置中间件来设置用户在收到下一个请求(并且只有下一个请求)时登录。然后设置会话 cookie,该 cookie 与响应一起返回,使用户在该请求之外登录。如果第二个 visit 在接收和处理第一个 visit 的响应之前发生,则不会在第二个请求中设置会话 cookie,因此用户实际上不会登录 - 因此导致重定向到根路径。

    test.log 应该准确识别是什么原因(或者只是尝试删除额外的 visit

    另外说明:在功能测试中测试响应代码通常是一种不好的气味,而应该专注于用户可以在页面上看到的内容。此外,您永远不应该将 eq 匹配器与 current_path 一起使用,因为在使用支持 JS 的驱动程序和动态页面时,它会导致不稳定的测试。相反,您应该使用 Capybara 提供的 have_current_path 匹配器 - expect(page).to have_current_path(conversations_path)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-29
      • 2021-10-02
      • 2010-09-23
      • 1970-01-01
      • 1970-01-01
      • 2019-12-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多