2

私はRyanBatesを使用nifty:authenticationしており、Rspecでテストを開始しています。何週間もこれと戦いましたが、それでも何が起こっているのか理解できません。

私のコントローラーは単に呼び出します

before_filter :login_required, :except => [:login]

これはlib/controller_authenticationで定義されています

def self.included(controller)
    controller.send :helper_method, :current_account, :logged_in?, :redirect_to_target_or_default
  end

  def current_account
    @current_account ||= Account.find(session[:account_id]) if session[:account_id]
  end

  def logged_in?
    current_account
  end

  def login_required
    unless logged_in?
      store_target_location
      redirect_to login_url, :alert => "You must first answer me these riddles three log in or sign up before accessing this page."
    end
  end

  def redirect_to_target_or_default(default, *args)
    redirect_to(session[:return_to] || default, *args)
    session[:return_to] = nil
  end

  private

  def store_target_location
    session[:return_to] = request.url
  end
end

アプリは意図したとおりに動作しますが、テストは毎回失敗します。何をしようとも、redirect_to login_url, :alert => "You must first ...log in"ページが表示されます。

私が試したこと:

controller.stub!( :login_required )
ControllerAuthentication.stub!(:current_account).and_return(Account.where(:username => 'ej0c').first)
#ControllerAuthentication.stub!(:logged_in?).and_return(Account.where(:username => 'ej0c').first)
ControllerAuthentication.stub!(:login_required).and_return(true)
MyDigisController.stub!( :login_required ).and_return(true)

これは、私が物事の理論全体を見逃していることを意味すると思います。ログインを機能させるにはどうすればよいですか?


Punitが以下に示唆するように私は試しました:[pre]

require 'spec_helper'

describe "View event details" do

  it "Should show a table of events" do
     @account = Account.where(:username => 'ej0c').first
     puts @account.inspect
     controller.stub!(:current_account).and_return(@account)
     controller.stub!(:logged_in?).and_return(true)
     session[:account_id] = @account.id
      visit '/my_digis/66/custom_events'
      page.should have_content('Events')

  end
end

@ account.inspectはうまく表示されましたが、私も

An expectation of :current_account was set on nil. Called from C:/Users/Ed/webapps/whendidji3/spec/con
.rb:8:in `block (2 levels) in <top (required)>'. Use allow_message_expectations_on_nil to disable warn
An expectation of :logged_in? was set on nil. Called from C:/Users/Ed/webapps/whendidji3/spec/controll
:in `block (2 levels) in <top (required)>'. Use allow_message_expectations_on_nil to disable warnings.

何が起こっているのかを理解するために高低を検索したので、詳細な説明をありがとう。

4

3 に答える 3

3

コントローラ仕様ではなくバニラ仕様を使用しています。これは、変数「controller」が設定されていないことを意味します。

コントローラ仕様を使用するには、文字列ではなく、コントローラクラス名をdescribeブロックに渡す必要があります。

describe MyController do

http://rspec.info/rails/writing/controllers.htmlを参照してください

それができたら、login_requiredをスタブするという元の考えを使用できるようになります。

于 2011-08-14T07:43:47.583 に答える
0

「current_account」メソッドをスタブする必要があります。あなたはこのようにそれを行うことができます-

@account = create_account #function to create an account for your specs
controller.stub!(:current_account).and_return(@account)
controller.stub!(:logged_in?).and_return(true)

必要に応じて、上記の行からスタブ認証のメソッドを作成する必要があります。

于 2011-08-11T18:03:14.050 に答える
0

OK、答えはリクエストスペックが必要だったということでした。

私はリクエスト仕様から始めましたが、それはrequestsフォルダーにありませんでした、そして私が尋ねた質問はそれをハーフリクエスト/ハーフコントローラー仕様に変形させました、どれも機能しません。

rspecの奇妙な点は、カピバラメソッドが正しく形成されていないと文句を言うことです...しかし、それを置いた場所では単純なものが機能しないことは言うまでもありません!

にある私の作業仕様specs/requests/my_digis_spec.rb

require 'spec_helper'

describe "MyDigis" do

   before :each do
@account = Account.where(:username => 'me').first
visit login_path
    fill_in 'Username or Email Address', :with => @account.email
    fill_in 'Password', :with => 'password'
  click_button('Log in')

終わり

it "Shows list of digis" do
  visit my_digis_path
  page.should have_content('Your Custom Event groups')
end

it "Lets you modify didji list" do
  visit my_digis_path
  click_button('Modify events')
  page.should have_content('Events for my_digi')
end

終わり

宣伝されているように簡単で、ログイン部分を取得するのに5週間かかりました。ありがとう。

于 2011-08-17T13:41:54.190 に答える