Rails集成测试:调用'to_json'时错误的参数数量错误

时间:2014-07-25 14:45:32

标签: ruby-on-rails json devise

我正在开发一个rails项目,我希望通过JSON支持直接Web访问和API访问。

目前,我正在尝试与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>'

我的问题:

1)当我将“.json”添加到帖子调用中的URI时会发生什么?我想它以某种方式调用.to_json(),但为什么它会错过一个参数,我会把它放在我的帖子中?

2)或者我做错了什么?有没有更好的方法在普通集成测试中发布JSON请求? (我没有get "/some_path.json" btw)的问题

非常感谢任何帮助!

版本信息:

  • rails 4.1.1

  • 设计3.2.4

编辑:

整个测试看起来像这样(还没有放入断言,因为我仍然试图理解我得到的错误):

test "simple json login" do
  users(:testguy).confirm!
  post "/users/sign_in.json", user: { nick: 'testguy', password: 'password' }, "CONTENT_TYPE" => 'application/json'
  puts response.body
end
顺便说一句,这个测试(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

EDIT2:

我最终缩小了这一点,原因是调用render :json(或者更确切地说,在Devise :: SessionsController中respond_with resource)。我将其子类化了,并且只要我使用某些选项调用to_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参数显式调用to_json,我会得到一个“ArgumentError:错误的参数数量(0表示1)”

这应该发生吗?或者这是我身边的错误还是我正在使用的框架内的某个地方?

0 个答案:

没有答案