在 RSpec 中测试 Rails 视图:为啥当我想测试“索引”时它会路由到“显示”?

Posted

技术标签:

【中文标题】在 RSpec 中测试 Rails 视图:为啥当我想测试“索引”时它会路由到“显示”?【英文标题】:Testing Rails views in RSpec: why does it route to "show" when I want to test "index"?在 RSpec 中测试 Rails 视图:为什么当我想测试“索引”时它会路由到“显示”? 【发布时间】:2015-06-03 14:35:27 【问题描述】:

我在spec/views/users/index_spec.rb 中有这个非常基本的视图规范:

require 'rails_helper'

RSpec.describe "users/index", type: :view do
  before(:each) do
    @user = create(:user)
    assign(:users, [@user])
  end

  it "renders a list of users" do
    render
    expect(page).to have_selector "tr##dom_id(@user)"
  end
end

执行它时,它告诉我以下内容:

Failures:

  1) users/index renders a list of users
     Failure/Error: render
     ActionView::Template::Error:
       No route matches :action=>"show", :controller=>"users", :id=>nil, :locale=>#<User id: 1, name: "Rosalinda Dach", email: "marilie@leffler.ca", encrypted_password: "$2a$04$G/z6lbFUpnh9FD3bymYBE.LrJK3acKr4TsURgCq7B77...", reset_password_token: nil, reset_password_sent_at: nil, remember_created_at: nil, sign_in_count: 0, current_sign_in_at: nil, last_sign_in_at: nil, current_sign_in_ip: nil, last_sign_in_ip: nil, confirmation_token: nil, confirmed_at: "2015-06-03 14:33:11", confirmation_sent_at: nil, unconfirmed_email: nil, failed_attempts: 0, unlock_token: nil, locked_at: nil, created_at: "2015-06-03 14:33:12", updated_at: "2015-06-03 14:33:12", avatar: nil> missing required keys: [:id]
     # /Users/josh/.rvm/gems/ruby-2.1.0@a4aa2/gems/actionpack-4.2.1/lib/action_dispatch/journey/formatter.rb:46:in `generate'
     # /Users/josh/.rvm/gems/ruby-2.1.0@a4aa2/gems/actionpack-4.2.1/lib/action_dispatch/routing/route_set.rb:727:in `generate'
     # /Users/josh/.rvm/gems/ruby-2.1.0@a4aa2/gems/actionpack-4.2.1/lib/action_dispatch/routing/route_set.rb:758:in `generate'
     # /Users/josh/.rvm/gems/ruby-2.1.0@a4aa2/gems/actionpack-4.2.1/lib/action_dispatch/routing/route_set.rb:801:in `url_for'
     # /Users/josh/.rvm/gems/ruby-2.1.0@a4aa2/gems/actionpack-4.2.1/lib/action_dispatch/routing/route_set.rb:280:in `call'
     # /Users/josh/.rvm/gems/ruby-2.1.0@a4aa2/gems/actionpack-4.2.1/lib/action_dispatch/routing/route_set.rb:345:in `block (2 levels) in define_url_helper'

为什么测试路由到users#show 而不是users#index

【问题讨论】:

【参考方案1】:

您可以更改您的代码:

RSpec.describe "users/index.html.erb", type: :view do

【讨论】:

【参考方案2】:

由于我没有找到合适的解决方案,我决定创建自己的在线 Markdown 编辑器,带有复制和粘贴功能:PIMP (Pasteable Ima​​ges, Markdown,Pandoc)。

http://pimp.suhail.uberspace.de/en

它看起来还不是很好,但它提供了使用 Pandoc 非常强大的 Markdown 创建语义上很棒的文档所需的一切,将图像直接从剪贴板粘贴到文本中,并将文档导出为各种格式(当时是 Docx 、Epub、Odt,也许以后还有 PDF)。

目前,要使用 PIMP,必须创建一个用户帐户。

整个项目与其说是一个真正的项目,不如说是一个概念验证,但如果人们喜欢并使用它,我很乐意将它变成一个真正的项目。

【讨论】:

以上是关于在 RSpec 中测试 Rails 视图:为啥当我想测试“索引”时它会路由到“显示”?的主要内容,如果未能解决你的问题,请参考以下文章

带有视图测试和嵌套资源的 Rspec 和 Rails

在rails 2.3+中测试(rspec)嵌套模型部分

Rails 视图规范:无法在命名空间视图中找到局部视图

为啥我在我的 Rspec 模型测试中得到单元化常量?

(Rails)PaperTrail和RSpec

在 Rails 3 上使用 Rspec 和 MongoID 清理或重置测试数据库