如何在需要API密钥时测试请求规范

时间:2013-10-17 23:14:18

标签: ruby-on-rails ruby rspec http-headers

我正在尝试为我的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.authenti‌​cation_token}", {user: {name: "New Name"}}, { 'HTTP_AUTHORIZATION' => "Token token=\"MyString\"" }
    response.status.should be(201)
  end
end

这不会引发异常,但它也不起作用。我的测试失败了,错误代码为401

2 个答案:

答案 0 :(得分:0)

我相信标题哈希应该是put的第三个参数(getpost等相同)。在您的示例中,您将其作为第二个。

来自文档:

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。因此,道德是值得花时间编写测试。