如何使用minitest在Rails中测试控制器的更新方法?

时间:2014-05-15 20:17:24

标签: ruby-on-rails functional-testing minitest

我正在尝试测试我的控制器。在我尝试测试update操作之前,一切都很好。

这是我的测试

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示例看起来与我所做的非常相似,但我仍然没有任何线索。

1 个答案:

答案 0 :(得分:5)

您至少需要向其发送Book的ID。请注意,路线如下所示:

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

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

您必须至少发送:id的参数才能使此测试正常工作。