Rails 以状态代码 406 进行响应



我一直在Ruby on Rails中测试我的函数。但是,测试(预期状态代码为:success(在收到状态代码406后失败。下面是确切的失败日志:

Failure: Expected response to be a <:success>, but was <406>.
test_should_post_comment_through_token_successfully(CommentControllerTest)
test/functional/comment_controller_test.rb:271:in `block in <class:CommentControllerTest>'

我读了一些关于406回应的信息,发现它代表"不可接受"。 所以我尝试设置AcceptContent-TypeAccept-LanguageAccept-Charset标题,但我没有运气。

这是我测试的代码:

test 'should post comment through token successfully' do
@params = {
id: 1,
body: "Test Comment",
username: "Bob"
}
@headers = {
"Accept" => "application/json",
"Accept-Language" => "en-US",
"Accept-Charset" => "utf-8",
"Content-Type" => "application/json",
"Token" => "abcdefg12345"
}
get :create_by_token, @params, @headers
assert_response :success
end

控制器内部的create_by_token功能:

def create_by_token
@node = Node.find params[:id]
@user = User.find_by_username params[:username]
@body = params[:body]
@token = request.headers['Token']
p request.headers["Accept"]
p request.headers["Content-Type"]
p request.headers["Token"]
if @user && @user.token == @token
begin
@comment = create_comment(@node, @user, @body)
msg = {
status: :created,
message: "Created"
}
respond_to do |format|
format.xml { render xml: msg.to_xml }
format.json { render json: msg.to_json }
end
rescue CommentError
msg = {
status: :bad_request,
message: "Bad Request"
}
respond_to do |format|
format.xml { render xml: msg.to_xml }
format.json { render json: msg.to_json }
end
end
else
msg = {
status: :unauthorized,
message: "Unauthorized"
}
respond_to do |format|
format.xml { render xml: msg.to_xml }
format.json { render json: msg.to_json }
end
end
end

我的路线:

post '/bot/comment.:format', to: 'comment#create_by_token'

我错过了什么关键的东西吗?我该如何解决这个问题?

我很乐意提供您需要的任何其他信息。

似乎这可能是respond_to阻止的错误。请检查路由是否已配置为资源或资源。

更新资源而不是单数,这将有助于respond_to阻止。

您也可以尝试将路线更新为/;

resources :samples, defaults: {format: :json}

哦,愚蠢的我。我意识到在我传递的所有参数中,格式也在 URL 内传递。但是,正如在测试中一样,我没有提到我可以以后缀(.xml.json(的格式传递的URL,我必须明确提及参数中的format。以下是更新的测试代码:

test 'should post comment through token successfully' do
@params = {
id: 1,
body: "Test Comment",
username: "Bob",
format: 'json'
}
@headers = {
"token" => "abcdefg12345"
}
post :create_by_token, @params, @headers
assert_response :success
end

@Sowmiya点赞,让我得出了这个结论。你的回答并不完全是我需要的解决方案,但它引起了我的思考。

相关内容

  • 没有找到相关文章

最新更新