在rails中我有一个JSON api我正在构建。在测试我的创建操作时,结果未正确解析。任何嵌套属性都在json中并且未解析。
{"user"=>
"\"id\":511,\"first_name\":\"Bryon\",\"last_name\":\"Hartmann\",\"email\":\"lexi@yahoo.com\",\"password_digest\":\"$2a$04$KeIkq/mRyxH2pLwjYW/EzuJCZMk4rHOLvnffyGjW8NwZhQkUubkWW\",\"admin\":false,\"created_at\":\"2014-11-23T02:38:38.487Z\",\"updated_at\":\"2014-11-23T02:38:38.487Z\"}",
"controller"=>"api/users",
"action"=>"create"}
# Controller Action
def create
@user = User.new user_params
if @user.save
respond_with @user
else
error_message = { notice: @user.errors.full_messages }
respond_with error_message, status: 401
end
end
# Test
it 'responds with 200 on success' do
user = build :user
post :create, user: user.to_json
expect(response).to be_success
expect(response).to have_http_status(200)
end
答案 0 :(得分:1)
构建REST api时的一个常见做法是将params作为普通的http属性发送。对于发布请求,可以在消息正文中对其进行编码(application / x-www-form-urlencoded)。
最好用以下curl命令解释:
curl --data "user[last_name]=testak&user[first_name]=chuck" http://example.com/users
你做了什么,但是这个:
curl --data "user=\{\"last_name\":\"Hartmann\, \"first_name\":\"Bryon\"}" http://example.com/users
对json有效负载的正确请求可能是:
curl --header "CONTENT_TYPE: application/json" --data "\{\"user\":\{\"last_name\":\"Hartmann\, \"first_name\":\"Bryon\"\}\}\" http://example.com/users
我个人更喜欢第一种选择,但这取决于api设计师。
为了将json有效负载转换为rails中的params散列,您可以将请求的Content-Type“标题设置为”application / json“
为了在rspec控制器测试中使用第一个选项,你可以:
post :create, user: user.attributes
对于第二个选项,执行:
post :create, user.to_json, "CONTENT_TYPE" => 'application/json'