我正在开发一个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
我最终缩小了这一点,原因是调用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)”
这应该发生吗?或者这是我身边的错误还是我正在使用的框架内的某个地方?