我有一个想要测试的书的视图。我通过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
之间有差异?我猜这就是抛出错误的原因。
book
上,不出现在控制器bookS
上。 books
控制器确实与book
控制器不同。
您的路由显示您在图书控制器中有传统的show
路由,但请注意它需要存在id
参数。您的模板必须尝试在/books
上调用get
操作的show
操作,而没有指定id。
如果你显示你的模板代码,我们可以确认
正如@PeterAlfvin所建议的,错误在我看来。在我的控制器中,我设置了一些与book
相关的变量,但我假设(现在我明白为什么不是这样)控制器在测试视图期间被调用,并且应该在测试期间设置这些变量。
因此,对于我的视图中调用的每个变量,我创建了一个赋值行,现在一切都工作了。
assign(:my_variable, MY_VALUE)
原来的错误被提出,因为我正在渲染link_to
与nil
URL。