2

私の Rails アプリでは、特定のクエリ文字列値を含むリクエストを非常に高速にブロックする方法が必要でした。高度な制約を使用してルートでこれを行うことができました。現実の世界ではうまく機能しますが、テストの書き方がわかりません。

これが私のroutes.rbのコードです:

class BlockedConstraint
  @@block_ids = []
  @@block_ids << '12345'
  @@block_ids << '67890'
  def self.matches?(request)
    @@block_ids.include?(request.query_parameters["app_id"])
  end
end

namespace :api do
  match "*path" => "block#block_request", :constraints => BlockedConstraint
  match 'ads' => 'status#get_status', :via => :get
  match 'init' => 'init#get_init', :via => :get
  #etc.
end

これが私の仕様です:

describe "BlockController" do
  it "blocks app_id 12345" do
    { :get => 'api/status', :app_id => '12345' }.should route_to(
      :controller => 'api/block',
      :action => 'block_request'
    )
  end
end

しかし、私はこのエラーが発生します:

Failure/Error: { :get => 'api/status', :app_id => '12345' }.should route_to(
Test::Unit::AssertionFailedError:
   The recognized options <{"action"=>"get_status", "controller"=>"api/status"}> did not match <{"action"=>"block_request", "controller"=>"api/block"}>, difference: <{"action"=>"block_request", "controller"=>"api/block"}>

また、routing/routes_spec.rb で、Routing を説明してみました。同じ結果です。(実際には、ルーティング スペックとコントローラー スペックのどちらに配置するのが最適かはわかりません。)

Rails 3.0.10 と Rspec 2.11.0 を実行しています。

4

1 に答える 1

0

route_to テストを使用する前に制約をテストしたことはありませんが、匿名コントローラーがテストに役立つ可能性があります。

https://www.relishapp.com/rspec/rspec-rails/v/2-4/docs/controller-specs/anonymous-controller

次のようなアプリケーション コントローラの仕様を記述できます。

require 'spec_helper'

describe ApplicationController do
  controller do
    def index
    end
  end

  describe 'handling block constraints' do
    before { get :index, :app_id => '100' }

    it "should block request" do
      should redirect_to(:controller => 'blocks', :action => 'block_request')
    end
  end
end
于 2012-09-26T06:10:38.960 に答える