在 Rails 和 minitest 中,如何为我的模型模拟 POST 创建请求时命名我的参数?
In Rails and minitest, how do I name my parameters when simulating a POST create request for my model?
我正在使用 Rails 5 和 minitest。如何在 minitest 中提交参数以模拟创建模型的 POST 请求?我有这个测试
test "do create" do
person = people(:one)
score = 10
post ratings_url, params: {rating[person_id]: person.id, rating[score]: score}
# Verify we got the proper response
assert_response :success
end
但是上面的结果是错误的
localhost:myapp davea$ rails test test/controllers/ratings_controller_test.rb
Running via Spring preloader in process 30344
/Users/davea/.rvm/gems/ruby-2.4.0/gems/activesupport-5.0.6/lib/active_support/dependencies.rb:293:in `require': /Users/davea/Documents/workspace/myapp/test/controllers/ratings_controller_test.rb:14: syntax error, unexpected ':', expecting => (SyntaxError)
url, params: {rating[person_id]: person.id, rating[score]: score
我将 POST 参数命名为 "rating[person_id]" 和 "rating[score]" 的唯一原因是,当表单在 Rails 中呈现为 [=36] 时,它们就是这样命名的=].
编辑:针对给出的答案,我在测试中尝试了这个
post ratings_url, params: { rating: { person_id: person.id, score: score} }
控制器看起来像
def save(params)
rating = Rating.new(rating_params)
rating.user = current_user
respond_to do |format|
我得到的错误是
Error:
RatingsControllerTest#test_do_create:
ActionController::UnknownFormat: ActionController::UnknownFormat
抱怨线路
respond_to do |format|
您的参数哈希中的哈希键无效。
params: {rating[person_id]: person.id, rating[score]: score }
您不能使用 rating[person_id]
并使用较新的哈希语法/您需要在此处使用哈希火箭,例如:
params: {rating[person_id] => person.id, rating[score] => score }
这是假设您有一个名为 rating
的局部变量,其中包含键...
如果您实际上并没有尝试从名为 rating 的局部变量中获取值...那么您可能需要更详细地了解您的结构,例如:
params: { rating: { person_id: person.id, score: score } }
当然...根据您正在编写的测试类型,您可能需要不使用 ratings_url
(也可以尝试使用和不使用 params
键)例如:
post :ratings, params: { rating: { person_id: person.id, score: score } }
post :ratings, rating: { person_id: person.id, score: score }
好吧,也许您的控制器正在为您提供 ActionController::UnknownFormat
的线索。您应该检查 logs\test.log
文件,看看您是否可以通过测试请求调试控制器响应。我的预感是您的控制器在 respond_to
块中缺少某种类型,或者缺少特定响应类型的 template/render。也许它作为 JS 发布而您的控制器没有响应,或者在某些情况下您应该像这样对任何类型做出响应:
respond_to do |format|
format.any {render :text => "I respond to any request format"}
end
我正在使用 Rails 5 和 minitest。如何在 minitest 中提交参数以模拟创建模型的 POST 请求?我有这个测试
test "do create" do
person = people(:one)
score = 10
post ratings_url, params: {rating[person_id]: person.id, rating[score]: score}
# Verify we got the proper response
assert_response :success
end
但是上面的结果是错误的
localhost:myapp davea$ rails test test/controllers/ratings_controller_test.rb
Running via Spring preloader in process 30344
/Users/davea/.rvm/gems/ruby-2.4.0/gems/activesupport-5.0.6/lib/active_support/dependencies.rb:293:in `require': /Users/davea/Documents/workspace/myapp/test/controllers/ratings_controller_test.rb:14: syntax error, unexpected ':', expecting => (SyntaxError)
url, params: {rating[person_id]: person.id, rating[score]: score
我将 POST 参数命名为 "rating[person_id]" 和 "rating[score]" 的唯一原因是,当表单在 Rails 中呈现为 [=36] 时,它们就是这样命名的=].
编辑:针对给出的答案,我在测试中尝试了这个
post ratings_url, params: { rating: { person_id: person.id, score: score} }
控制器看起来像
def save(params)
rating = Rating.new(rating_params)
rating.user = current_user
respond_to do |format|
我得到的错误是
Error:
RatingsControllerTest#test_do_create:
ActionController::UnknownFormat: ActionController::UnknownFormat
抱怨线路
respond_to do |format|
您的参数哈希中的哈希键无效。
params: {rating[person_id]: person.id, rating[score]: score }
您不能使用 rating[person_id]
并使用较新的哈希语法/您需要在此处使用哈希火箭,例如:
params: {rating[person_id] => person.id, rating[score] => score }
这是假设您有一个名为 rating
的局部变量,其中包含键...
如果您实际上并没有尝试从名为 rating 的局部变量中获取值...那么您可能需要更详细地了解您的结构,例如:
params: { rating: { person_id: person.id, score: score } }
当然...根据您正在编写的测试类型,您可能需要不使用 ratings_url
(也可以尝试使用和不使用 params
键)例如:
post :ratings, params: { rating: { person_id: person.id, score: score } }
post :ratings, rating: { person_id: person.id, score: score }
好吧,也许您的控制器正在为您提供 ActionController::UnknownFormat
的线索。您应该检查 logs\test.log
文件,看看您是否可以通过测试请求调试控制器响应。我的预感是您的控制器在 respond_to
块中缺少某种类型,或者缺少特定响应类型的 template/render。也许它作为 JS 发布而您的控制器没有响应,或者在某些情况下您应该像这样对任何类型做出响应:
respond_to do |format|
format.any {render :text => "I respond to any request format"}
end