2

テスト駆動開発を使用してコードを拡張する目的で、既に作成したコードのテストをいくつか作成しようとしています。

インデックス アクションが「user_info」メソッドを呼び出すコントローラーがあります。このメソッドは、ソーサリーの current_user 変数に依存するいくつかのインスタンス変数を収集するだけです。例えば:

def user_info
  @current_A = current_user.a
  @current_B = current_user.b
end

def index
  user_info
  // rest of the method goes here
end

このコード ベースをテストする感覚をつかむために、rspec を使用していくつかのテストを書き始めました。私のコントローラーの仕様は非常に基本的で、次のようになります。

describe MyController do
  describe "GET 'index'" do
    get 'index'
    response.should be_success
  end
end

ただし、この仕様を実行しようとすると、次のエラーが発生します: NoMethodError: undefined method 'a' for false:FalseClass

まず第一に、仕様に Sorcery メソッドの current_user を認識させるにはどうすればよいですか? そして、好奇心から、current_user が FalseClass のインスタンスとしてフラグ付けされているのはなぜですか? Sorcery メソッドを呼び出していない場合 (そして、コード内の他の場所で current_user を定義していない場合)、nil として表示されるべきではありませんか?

4

4 に答える 4

4

Sorceryテストヘルパーを使用するには、に次の行が必要ですspec_helper.rb

Rspec.configureブロックには次のものが含まれている必要があります。

RSpec.configure do |config|
  config.include Sorcery::TestHelpers::Rails
end

これを配置したら、Sorceryテストヘルパーを使用できます。コントローラテストの場合、テストに以下を追加します。

@user = either a fixture or a factory to define the user
login_user

指定したくない場合は@user、引数を渡すことができます。

login_user(fixture or factory definition)

ログインするcurrent_userと、テストに利用できるようになります。

logout_userもご利用いただけます。

ヘルパーと連携するユーザーフィクスチャの設定については、 SorceryWikiを参照してください。login_user

于 2012-03-30T12:08:06.920 に答える
0

@nmott が述べたように、次の 2 つのことを行う必要があります。

1) 以下を使用してテキスト ヘルパー メソッドを登録します。

RSpec.configure do |config|
  config.include Sorcery::TestHelpers::Rails
end

2)あなたの例では、そのようにアクセスcurrent_userしますcontroller.current_user:

login_user(user)
expect(controller.current_user).to be_present
于 2013-12-01T16:12:44.650 に答える
0

On important bit is to ensure the user is activated after creation if you're using the :user_activation submodule of Sorcery.

So, if you're using the fabrication gem, that would look like,

Fabricator(:properly_activated_user, :from => :user) do
  after_create { |user| user.activate! }
end
于 2013-05-18T00:44:29.053 に答える
0

リチャード、問題はあなたが current_user を持っていない可能性があります。

そのためには、ログイン プロセスをシミュレートする必要があります。

コントローラーの仕様でそれを行うことができますが、ここには良い例がありません。私はあなたのように既存のコードで仕様を書いていましたが、代わりに要求仕様を使用することは理にかなっています。

また、私はソーサリー用のものを持っていません (私はそうすべきです!!) フォームに記入するためにカピバラを使用しています。それでも、ここに私の仕様がどのように見えるかがあります:

(ここで :account は :user と同じです)

 context "when logged in" do 

 before :each do
@account = Factory.create(:account)
@current_game = Factory(:game_stat)
visit login_path
    fill_in 'Username or Email Address', :with => @account.email
    fill_in 'Password', :with => @account.password
  click_button('Log in')

終わり

したがって、工場は別の問題です。私のものは次のようになりました。

Factory.define :account do |f|
 f.sequence(:username) { |n| "ecj#{n}" }
 f.sequence(:email) { |n| "ecj#{n}@edjones.com" }
 f.password "secret"
 f.password_confirmation {|u| u.password }

終わり

ファクトリを使用する必要はありませんが、そのセッションと current_user を確立する必要があります。

于 2012-03-14T13:29:45.037 に答える