Rspec视图:没有路由匹配使用错误的控制器名



我有一个想要测试的书的视图。我通过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
...

为什么我的路线在bookbookS之间有差异?我猜这就是抛出错误的原因。

show动作只出现在控制器book上,不出现在控制器bookS上。

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

您的路由显示您在图书控制器中有传统的show路由,但请注意它需要存在id参数。您的模板必须尝试在/books上调用get操作的show操作,而没有指定id。

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

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

因此,对于我的视图中调用的每个变量,我创建了一个赋值行,现在一切都工作了。

assign(:my_variable, MY_VALUE)

原来的错误被提出,因为我正在渲染link_tonil URL。

最新更新