0

Rspecの仕様のほとんどを作成しましたが、1つの重要な問題に直面しています。すべてのルートにルーティング制約を設定しました(それ自体は議論の余地があるかもしれません)。Ipアドレス(別のIpAddressモデルに保存されている)を許可した管理者のみが、アプリケーションの特定の領域にアクセスできます。

簡単に言うと、仕様内のすべてに自由にアクセスできるように、制約モデルをモックまたはスタブしたいと思います。

私の制約は次のようになります。

class IpAddressConstraint
  def initialize
    @ips = IpAddress.select('number')
  end

  def matches?(request)
    if @ips.find_by_number(request.remote_ip).present? || Rails.env.test? #<- temporary solution
      true
    else
      if @current_backend_user.present? 
        backend_user_sign_out 
      else
        raise ActionController::RoutingError.new('Not Found')
      end
    end
  end
end

MyApp::Application.routes.draw do
  constraints IpConstraint.new do
    #all routes
  end
end

Rspecでこのルーティング制約をテストするための最良の方法は何ですか?現在、条件を追加したので、テスト環境にいる場合は、これらの制約を完全にスキップできます。どういうわけかこの制約をシミュレートできればもっと良いでしょう。

4

1 に答える 1

1

このようなものはどうですか?

describe "Some Feature" do

context "from allowed ip" do
  before(:each) {IpAddress.create(number: '127.0.0.1')} 

   it "should allow access to foo" do 
     ..... 
   end

    ....
end

context "from non allowed ip" do 
  it "shouldn't allow access to foo" do 
     ..... 
  end
end

次に、特により複雑なセットアップを行う必要がある場合は、IPアドレス作成をヘルパーモジュールまたは関数のいずれかに抽出できます。常にそこに置きたい場合は、spec_helperファイル構成ブロックに追加して各/すべての仕様の前に実行できますが、許可されていないIPを正常にブロックすることをテストするのは困難です。

于 2013-02-08T16:08:12.757 に答える