2014-05-15 44 views
1

我想测试我的控制器。一切都很好,直到我试图测试update行动。如何在使用minitest的Rails中测试控制器的更新方法?

这是我的测试

require 'test_helper' 

class BooksControllerTest < ActionController::TestCase 
    test "should not update a book without any parameter" do 
     assert_raises ActionController::ParameterMissing do 
      put :update, nil, session_dummy 
     end 
    end 
end 

这是我的控制器

class BooksController < ApplicationController 

    (...) 

    def update 
     params = book_params 
     @book = Book.find(params[:id]) 

     if @book.update(params) 
      redirect_to @book 
     else 
      render 'edit' 
     end 
    end 

    (...) 

    def book_params 
     params.require(:book).permit(:url, :title, :price_initial, :price_current, :isbn, :bought, :read, :author, :user_id) 
    end 
end 

我的应用程序的书籍控制器路线如下:

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 

当我运行rake test我得到:

1) Failure: 
BooksControllerTest#test_should_not_update_a_book_without_any_parameter [/Users/acavalca/Sites/book-list/test/controllers/books_controller_test.rb:69]: 
[ActionController::ParameterMissing] exception expected, not 
Class: <ActionController::UrlGenerationError> 
Message: <"No route matches {:action=>\"update\", :controller=>\"books\"}"> 
---Backtrace--- 
test/controllers/books_controller_test.rb:70:in `block (2 levels) in <class:BooksControllerTest>' 
test/controllers/books_controller_test.rb:69:in `block in <class:BooksControllerTest>' 
--------------- 

那么,我在这里错过了什么?我已经完成了搜索,但找不到任何东西。只有几个RSpec的例子,看起来和我所做的很相似,但我还是没有任何线索。

回答

4

您需要至少发送一个Book的ID。请注意,路线是这样的:

PUT /books/:id(.:format)     books#update 

:id部分是URL的一个组成部分。这意味着试图执行PUT/books/没有任何意义,但是执行/books/1是一个有效的URL,即使ID 1与数据库中的任何记录都不匹配。

您必须至少发送:id的参数才能进行此测试。

+0

呃!它的工作,谢谢! :) –

+0

没问题!一定要将这个回答标记为答案! – MrDanA

相关问题