【问题标题】:Rspec Views : No route matches using wrong controller nameRspec Views:使用错误的控制器名称没有路由匹配
【发布时间】:2015-08-16 13:37:54
【问题描述】:

我有一本想要测试的书的视图。 我通过http://..../books/1在浏览器中渲染它

这是我在运行 Rspec 时遇到的错误:

1) books/show should display the book name
     Failure/Error: render
     ActionView::Template::Error:
     No route matches {:action=>"show", :controller=>"books"}

这是我使用Factory Girl 进行的测试:

RSpec.describe "books/show", type: :view do
  before(:each) do
    @book = FactoryGirl.create(:book)
    render
  end

  it "should display the book name" do
    rendered.should contain(@book.name)
  end
end

我想我发现了错误,但我不明白。

在我的routes.rb 文件中,我有resources :books

如果我在控制台中执行 rake 路由,我会得到:

...
books       GET      /books(.:format)                              books#index
            POST     /books(.:format)                              books#create
new_book    GET      /books/new(.:format)                          books#new
edit_book   GET      /books/:id/edit(.:format)                     books#edit
book        GET      /books/:id(.:format)                          books#show
            PATCH    /books/:id(.:format)                          books#update
            PUT      /books/:id(.:format)                          books#update
            DELETE   /books/:id(.:format)                          books#destroy
...

为什么book 和bookS 之间的路线存在差异?我想这就是引发错误的原因。

show 操作仅适用于控制器 book,而不适用于 bookS。

【问题讨论】:

  • 试试render @book 或render book_path(@book) 让我知道:)
  • @ArupRakshit 没有更多的成功:(

标签: ruby-on-rails rspec routes


【解决方案1】:

books 控制器确实与 book 控制器不同。

您的路由表明您在 books 控制器中有传统的 show 路由,但请注意,它要求存在 id 参数。您的模板必须尝试通过对/books 的get 操作调用show 操作而不指定ID。

如果您显示您的模板代码,我们可以确认。

【讨论】:

  • 不确定我是否理解,而不是打电话给render 我应该打电话给get 'books/my_id' 吗?因为我收到错误undefined method 'get' for #<RSpec::ExampleGroups
  • 不,你的渲染很好。我是说我认为您的模板有问题(例如,其中包含一些链接)并建议您发布该代码以便我们查看。
  • 你是对的,和那个有关,我会发布我的答案,看看这是不是正常行为。
【解决方案2】:

正如@PeterAlfvin 建议的那样,我认为这个错误。 在我的控制器中,我设置了一些与book 相关的变量,但我假设(现在我明白为什么不是)在测试视图期间调用了控制器,并且应该在测试期间设置了这些变量。

因此,对于我视图中调用的每个变量,我创建了一个分配行,现在一切正常。

assign(:my_variable, MY_VALUE)

引发原始错误是因为我正在渲染带有 nil URL 的 link_to。

【讨论】:

    猜你喜欢
    • 2018-02-11
    • 2017-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多