Ruby on rails Rails集成测试:调用“to_json”时参数数目错误

Ruby on rails Rails集成测试:调用“to_json”时参数数目错误,ruby-on-rails,json,devise,Ruby On Rails,Json,Devise,我正在从事一个rails项目,我希望通过JSON支持直接web访问和API访问 目前,我正在尝试让Deviate使用JSOn。但是,在测试期间,当我将.json添加到URL时,我遇到了ArgumentError: post "/users/sign_in", user: { nick: 'testguy', password: 'password' }, "CONTENT_TYPE" => 'application/json' 这将执行,但会生成一个HTML响应 post "/users

我正在从事一个rails项目,我希望通过JSON支持直接web访问和API访问

目前,我正在尝试让Deviate使用JSOn。但是,在测试期间,当我将.json添加到URL时,我遇到了ArgumentError:

post "/users/sign_in", user: { nick: 'testguy', password: 'password' }, "CONTENT_TYPE" => 'application/json'
这将执行,但会生成一个HTML响应

post "/users/sign_in.json"
这也会执行,并生成JSON输出,抱怨我需要登录或注册

现在,我希望这项工作:

post "/users/sign_in.json", user: { nick: 'testguy', password: 'password' }, "CONTENT_TYPE" => 'application/json'
但是,我确实在那一行中得到了一个执行错误:

 1) Error:
UserFlowsTest#test_simple_json_login:
ArgumentError: wrong number of arguments (0 for 1)
    test/integration/user_flows_test.rb:54:in `block in <class:UserFlowsTest>'
顺便说一句,这个测试HTTP登录,然后是JSON get,效果很好:

test "basic json" do
  get new_user_session_path
  assert_response :success
  users(:testguy).confirm!
  post_via_redirect new_user_session_path, user: { nick: 'testguy', password: 'password' }
  assert_nil flash[:alert]
  assert_equal 'Signed in successfully.', flash[:notice]
  assert_equal '/discussions', path
  get "#{path}.json" #, type: :json
  assert_match /"id":\d+/, response.body
end
编辑2: 我最终缩小了范围,将其归结为调用render:json,或者更确切地说,使用designe::sessioncontroller中的资源响应_。我对它进行了子类化,只要我使用一些选项调用_json,它就会工作:

respond_to do |format|
  format.json {
    render json: current_user.to_json(only: [:id, :authentication_token])
  }
  format.html {
    redirect_to after_sign_in_path_for(resource)
  }
如果我没有使用非nil参数显式调用_json,我会得到一个ArgumentError:1的参数数量错误为0


这应该发生吗?或者这是我这边的一个bug,还是我正在使用的框架中的某个bug?

在您的测试框架中,当您向URI添加.json时,什么都不会发生;它只是发布到您传递的URI。所以你没有发布JSON。。。您正在发布带有无效标题的标准表单数据,表明您正在发布JSON。在没有看到更多代码的情况下,不清楚这是否是导致错误的原因,但知道这一点应该会给你一个起点。好吧,我的假设是什么都没有发生。然而,我确实得到了上面显示的ArgumentError,这正是我正在显示的代码行。如果我只是从那一行中删除.json,我不会得到错误…嗨,我得到了同样的问题。你的解决方案是什么?提前谢谢。请发布解决方案好吧,我没有找到解决方案。。。最后,我放弃了我的小项目,告诉自己在未来的工作中不要依赖太多的框架。。。。
respond_to do |format|
  format.json {
    render json: current_user.to_json(only: [:id, :authentication_token])
  }
  format.html {
    redirect_to after_sign_in_path_for(resource)
  }