10

私は、JSON形式でバージョン管理されたREST APIを備えたRailsアプリケーションに取り組んでいます(この優れたRyanのキャストによると:http://railscasts.com/episodes/350-rest-api-versioning)。

たとえば、spec/requests仕様があります。

require 'spec_helper'

describe "My Friends" do
  describe "GET /my/friends.json" do
    it "should get my_friends_path" do
      get v1_my_friends_path, {}, {'HTTP_ACCEPT' => 'application/vnd.myapp+json; level=1'}
      response.status.should be(401)
    end
  end
end

そしてそれはうまくいきます。しかし(この例を維持して)ルーティング仕様をどのように書くことができますか?たとえば、この仕様は正しくありません。

require 'spec_helper'

describe "friends routing" do
  it "routes to #index" do
    get("/my/friends.json", nil, {'HTTP_ACCEPT' => 'application/vnd.myapp+json; level=1'}).
      should route_to({ action: "index",
                    controller: "api/v1/private/my/friends",
                        format: "json" })
  end
end

私はさまざまな方法を試しました(request.headers['Accept']and @request.headers['Accept']、where requestis undefined and @requestis nil); どうしたらいいのかわからない。

私はRuby1.9.3、Rails 3.2.6、rspec-rails2.11.0を使用しています。ありがとう。

4

5 に答える 5

13

Cristophe と Piotr の回答のアイデアを組み合わせることで、自分に合った解決策を思いつきました。rspec と rails 3.0 を使用しています。

it 'should route like i want it to' do 
  Rack::MockRequest::DEFAULT_ENV["HTTP_ACCEPT"] = "*/*"
  {get: "/foo/bar"}.
    should route_to(
    controller: 'foo',
    action: 'bar',
  )
  Rack::MockRequest::DEFAULT_ENV.delete "HTTP_ACCEPT"
end
于 2013-05-09T17:23:51.523 に答える
7

現在、ルーティング仕様で追加のヘッダーを送信することはできません。これは、次のように記載されているためline 608ですactionpack-3.2.5/lib/action_dispatch/routing/route_set.rb

env = Rack::MockRequest.env_for(path, {:method => method})

pathはリクエストされたパス"/my/friends.json"であり、メソッドは次のような:get 結果を含みます:env

{
 "rack.version"=>[1, 1],
 "rack.input"=>#<StringIO:0xb908f5c>,
 "rack.errors"=>#<StringIO:0xb908fac>,
 "rack.multithread"=>true,
 "rack.multiprocess"=>true,
 "rack.run_once"=>false,
 "REQUEST_METHOD"=>"GET",
 "SERVER_NAME"=>"your-url.com", # if path was http://your-url.com/
 "SERVER_PORT"=>"80",
 "QUERY_STRING"=>"",
 "PATH_INFO"=>"/",
 "rack.url_scheme"=>"http",
 "HTTPS"=>"off",
 "SCRIPT_NAME"=>"",
 "CONTENT_LENGTH"=>"0"
}

モックできる場合はRack::MockRequest::env_for、env_for によって生成されたもの以外のヘッダーを挿入できるはずです (上記のハッシュを参照)。

現在 route_to マッチャーを間違って使用していること以外は、次のようにメソッドとパスを指定するハッシュで呼び出す必要があります。

{ get: '/' }.should route_to(controller: 'main', action: 'index')

その env_for をモックアウトしてヘッダーを返すことができたかどうかをお知らせください。

よろしくクリストフ

于 2012-07-19T11:48:12.163 に答える
5
before do
  ActionDispatch::TestRequest::DEFAULT_ENV["action_dispatch.request.accepts"] = "application/vnd.application-v1+json"
end

after do
  ActionDispatch::TestRequest::DEFAULT_ENV.delete("action_dispatch.request.accepts")
end
于 2012-10-15T12:09:50.577 に答える