我正在尝试测试我的控制器。在我尝试测试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示例看起来与我所做的非常相似,但我仍然没有任何线索。
答案 0 :(得分:5)
您至少需要向其发送Book
的ID。请注意,路线如下所示:
PUT /books/:id(.:format) books#update
:id
部分是网址的组成部分。这意味着尝试执行PUT
到/books/
没有意义,但对/books/1
执行一个是有效的URL,即使ID 1与任何记录都不匹配数据库中。
您必须至少发送:id
的参数才能使此测试正常工作。