我正在尝试为我的API编写请求规范,但需要传递API密钥。 API密钥作为标头传递。在我发布的网页中,我这样传递:
Header: Authorization
Value: Token token="MyString"
在我的规范中,我正在尝试这个:
describe "sessions" do
before do
FactoryGirl.create(:api_key)
end
it "is authenticated with a token" do
put "/api/v1/users/#{@user.id}?user_email=#{@user.email}&auth_token=#{@user.authentication_token}", {user: {name: "New Name"}}, { 'HTTP_AUTHORIZATION' => "Token token=\"MyString\"" }
response.status.should be(201)
end
end
这不会引发异常,但它也不起作用。我的测试失败了,错误代码为401
答案 0 :(得分:0)
我相信标题哈希应该是put
的第三个参数(get
,post
等相同)。在您的示例中,您将其作为第二个。
来自文档:
put(path, parameters = nil, headers_or_env = nil)
http://api.rubyonrails.org/classes/ActionDispatch/Integration/RequestHelpers.html#method-i-put
答案 1 :(得分:0)
问题是简单的格式化。我必须添加一些日志记录才能确切了解Authorization标头的发送方式。我只是复制了那个输出并用我的测试值替换了值,所以正确的答案是:
it "is authenticated with a token" do
put "/api/v1/users/#{@user.id}?user_email=#{@user.email}&auth_token=#{@user.authentication_token}", {user: {name: "New Name"}}, { "HTTP_AUTHORIZATION"=>"Token token=\"#{@api_key.access_token}\"" }
response.status.should be(201)
end
我在添加日志记录时发现了另一个问题。我有一个改变我的api_token的前置过滤器,所以我的测试api_token的“秘密”在发送呼叫之前被改为真正的api_token。 Whops。因此,道德是值得花时间编写测试。