17

Restful Authentication と RSpec を含む基本アプリであるBortを使用して、学習アプリケーションを作成しました。私はそれを起動して実行し、ユーザーが何かを行う前にログインする必要がある新しいオブジェクトを追加しました(before_filter :login_requiredコントローラーで)。[編集: またhas_many、新しいクラスのユーザーとユーザーだけがそれを見ることができるはずであることにも言及する必要があります。]

多数のデフォルト テストを作成した Rspec のジェネレーターを使用して、新しいモデル/コントローラーを作成しました。それらが存在しない場合はすべて合格しますがbefore_filter、予想されるように、 が配置されると、いくつかは失敗しbefore_filterます。

ログインしているユーザーがいる/いないかのように、生成されたテストを実行するにはどうすればよいですか? ログインしていない一致のバッチ全体が必要ですか - リダイレクト テストはありますか? 私はそれがある種のモッキングまたはフィクスチャ手法であると想定していますが、私はRSpecに不慣れで少し漂流しています。優れた RSpec チュートリアル リンクも歓迎します。

4

4 に答える 4

7

私は非常によく似た設定をしています。以下は、このようなものをテストするために現在使用しているコードです。describe私が入れた各s で:

it_should_behave_like "login-required object"
def attempt_access; do_post; end

必要なのはログインだけの場合、または

it_should_behave_like "ownership-required object"
def login_as_object_owner; login_as @product.user; end
def attempt_access; do_put; end
def successful_ownership_access
  response.should redirect_to(product_url(@product))
end

所有権が必要な場合。明らかに、ヘルパー メソッドはターンごとに (ほとんど) 変化しませんが、これでほとんどの作業が行われます。これは私のspec_helper.rbにあります

shared_examples_for "login-required object" do
  it "should not be able to access this without logging in" do
    attempt_access

    response.should_not be_success
    respond_to do |format|
      format.html { redirect_to(login_url) }
      format.xml { response.status_code.should == 401 }
    end
  end
end

shared_examples_for "ownership-required object" do
  it_should_behave_like "login-required object"

  it "should not be able to access this without owning it" do
    attempt_access

    response.should_not be_success
    respond_to do |format|
      format.html { response.should be_redirect }
      format.xml { response.status_code.should == 401 }
    end
  end

  it "should be able to access this if you own it" do
    login_as_object_owner
    attempt_access

    if respond_to?(:successful_ownership_access)
      successful_ownership_access
    else
      response.should be_success
    end
  end
end
于 2008-09-15T19:04:35.737 に答える
7

認証をテストするのではなく、ユーザーの認証が必要なコントローラーをテストするときは、通常、フィルター メソッドをスタブします。

before(:each) do
  controller.stub!(:authenticate).and_return(true)
end

上記の例は、 before_filter が認証方法に設定されている場合に機能します。

before_filter :authenticate

私のアプリの認証では HTTP 基本認証を使用していますが、実際には他の認証メカニズムでもかまいません。

private
def authenticate
  authenticate_or_request_with_http_basic do |user,password|
    user == USER_NAME && password == PASSWORD
  end
end

かなりわかりやすいテスト方法だと思います。

于 2009-12-22T01:02:51.473 に答える
4

私は自分自身の質問に対するいくつかの答えを見つけました。restful_authentication基本的に、追加したにもかかわらず、自動生成された rspec コントローラー テストがパスできるように、ユーザーをモック アウトする方法を理解する必要がありましbefore_filter: login_requiredた。

ここに私が見つけたばかりのリソースのいくつかがあります:

RSpec: 次のように動作する必要があります

rspec、restful_authentication、および login_required

コントローラー仕様内で restful_authentication current_user を使用する

CRUD コントローラーの RSpec をドライアップする

于 2008-09-16T12:16:55.430 に答える
1

ログインしているユーザーをモックするために、コントローラーをハックして@current_user手動で設定します。

module AuthHelper
  protected

  def login_as(model, id_or_attributes = {})
    attributes = id_or_attributes.is_a?(Fixnum) ? {:id => id} : id_or_attributes
    @current_user = stub_model(model, attributes)
    target = controller rescue template
    target.instance_variable_set '@current_user', @current_user

    if block_given?
      yield
      target.instance_variable_set '@current_user', nil
    end
    return @current_user
  end

  def login_as_user(id_or_attributes = {}, &block)
    login_as(User, id_or_attributes, &block)
  end
end
于 2008-09-27T16:44:21.557 に答える