我正在尝试对我的应用程序进行一些基本测试。
我有一个控制器transactions_controller.rb,其中有一个'create'方法。这是我的路线:
root GET / home#index
PUT /transaction/:id(.:format) transactions#create
GET /transaction/:id(.:format) transactions#show
GET /types/:type(.:format) transactions#types
GET /sum/:id(.:format) transactions#sum
这是transactions_controller_test.rb测试方法中的代码:
test "should create new transaction" do
put :create, { amount: 7000, type: "cars", parent_id: 2 }
assert_response(:success, message = '{ "status": "ok" }')
end
如果我运行rake test,它会产生以下错误:
ActionController::UrlGenerationError: No route matches {:action=>"create", :controller=>"transactions"}
为什么一切都到位了?有人能帮助我吗?
答案 0 :(得分:1)
routes.rb中的错误
PUT /transaction/:id(.:format) transactions#create
应该是
POST /transactions(.:format) transactions#create
您的路线是交易路线#update(带有身份参数的PUT请求)。 它应该看起来像:
resources :transactions, only: [:show, :create]
答案 1 :(得分:1)
您应该使用POST
not PUT
to create a resource。在Rails和REST中,PATCH
或PUT
操作通常用于更新现有资源。由于HTTP动词定义的语义,如果支持PATCH,PUT在以后的Rails版本中通常会被折旧。简而言之 - 使用PATCH而不是PUT。
将路线定义更改为:
resources :transactions, only: [:show, :create, :update]
这会将您的路线更改为:
GET /transactions, transactions#index
POST /transactions, transactions#create
PATCH /transactions/:id, transactions#update
您更改测试以使用正确的HTTP动词:
test "should create new transaction" do
post :create, { amount: 7000, type: "cars", parent_id: 2 }
assert_response(:success, message = '{ "status": "ok" }')
end
此外,您应该考虑为您的其他路线提供更加宁静的模式:
resources :transactions, only: [:show, :create] do
collection do
get :sum # /transactions/sum or the sum of all transactions.
end
end
有点不清楚/type
的作用,但如果它显示每种类型的事务,您可能希望使用带有索引操作的查询参数:
# GET /transactions?type=car
def index
@transactions = Transaction.all
@transactions = @transactions.where(type: params[:type]) if params[:type]
end
此外,您可能需要遵循参数的rails约定:
post :create, { transaction: { amount: 7000, type: "cars", parent_id: 2 } }
这种嵌套最初可能看起来很傻,但它允许您正确使用Rails form helpers和强参数。
答案 2 :(得分:-1)
在路线中,当您说' PUT /transaction/:id(.:format)交易#create'时,这意味着您需要发送attr id,然后在您的测试需要
put:create,{amount:7000,type:" cars",id:2}
或删除路径的params id