在 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