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

时间:2015-08-16 13:37:54

标签: ruby-on-rails rspec routes

我想看一本我想测试的书。 我通过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

1 个答案:

答案 0 :(得分:0)

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

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

assign(:my_variable, MY_VALUE)

引发了原始错误,因为我正在使用link_to网址呈现nil