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

Alv*_*nti 1 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
Run Code Online (Sandbox Code Playgroud)

这是我的控制器

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
Run Code Online (Sandbox Code Playgroud)

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

    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
Run Code Online (Sandbox Code Playgroud)

当我跑步时,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>'
---------------
Run Code Online (Sandbox Code Playgroud)

那么,我在这里错过了什么?我已经对此进行了搜索,但找不到任何东西.只有少数RSpec示例,看起来与我所做的非常相似,但我仍然没有任何线索.

MrD*_*anA 5

您至少需要向其发送一个ID Book.请注意,路由如下所示:

PUT    /books/:id(.:format)                  books#update
Run Code Online (Sandbox Code Playgroud)

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

您必须至少发送一个参数:id才能使此测试工作.