16

これらのツールのいくつかを初めて使用しています。私はドキュメントを読みましたが、ここで私が達成しようとしていることを正確に尋ねたかったのです。

コントローラー仕様で実行できるいくつかのアクションをテストしたい一連のユーザーがいます。各ユーザーが作成されると、関連付けられたオブジェクトを作成するために発生する一連のコールバックがあります。

これらのユーザー インスタンスと、その ActiveRecord クラスの関連オブジェクトにアクセスしたいと考えています。たとえば、ユーザーには一連のリストがあるため、たとえば user1.lists を呼び出せるようにしたいと考えています。

また、このセットアップを上部に分離して、レッツまたはビフォア ブラックのいずれかを使用したいと思います。次のように let を呼び出すだけのようです。

# will test that get_count_for_list will return 5
describe ApiController do

  # why same name - seems really confusing!
  let(:user) { FactoryGirl.create(:user) }
  let(:user2) { FactoryGirl.create(:user2) }

関連するコールバックを呼び出しません。これは正しいです?それともタイミングの問題でしょうか?

let を使用して、user.id などの ExampleGroups でこれらのオブジェクトにアクセスできる構文が気に入っていますが、user.lists にはアクセスできません。現在、私は次のようなことをしています:

# will test that get_count_for_list will return 5

describe ApiController do

  # why same name - seems really confusing!
  let(:user) { FactoryGirl.create(:user) }
  let(:user2) { FactoryGirl.create(:user2) }
  let(:user3) { FactoryGirl.create(:user3) }
  
  before do
    FactoryGirl.create(:user2)
    FactoryGirl.create(:user3)
  end

しかし、もっと良い方法が必要だと感じています。これらのユーザーを 2 回作成していますか?

どうも

編集 1

ここで問題のコードを分離しました。global_id 値は、コールバックを介して作成されます。データベースに正しく存在し、対応する find_by_email を介してアクセスできますが、user2 変数を使用してもアクセスできません。

require 'spec_helper'

# will test that get_count_for_list will return 5
describe ApiController do
  # why same name - seems really confusing!
  let!(:user) { FactoryGirl.create(:user) }
  let!(:user2) { FactoryGirl.create(:user2) }
  let!(:user3) { FactoryGirl.create(:user3) }


  
  before do
    session[:user_id]=user.id # works
  end

  describe 'FOLLOW / UNFOLLOW options' do
    it 'shall test the ability to follow another user' do
      puts "user1: " + user.global_id.to_s # doesn't output anything
      u2=User.find_by_email('jo@jo.com') # corresponds to user2
      post :follow, :global_id => user2.global_id # doesn't work
      #post :follow, :global_id => u2.global_id  #works


      u3=User.find_by_email('su@su.com')
      puts "user_3" + u3.global_id.to_s # outputs correct value

      post :follow, :global_id => user3.global_id  #doesn't work
      #post :follow, :global_id => u3.global_id # works


      post :unfollow, :global_id => user.following.sample(1)
      response.code.should eq('200')
    end
  end
end
4

2 に答える 2

29

rspecドキュメントを確認してください:https ://www.relishapp.com/rspec/rspec-core/v/2-11/docs/helper-methods/let-and-let

letは遅延評価されることに注意してください。それが定義するメソッドが最初に呼び出されるまで評価されません。レットが使えます!各例の前にメソッドの呼び出しを強制します。

つまり、レコードとlet一緒に使用するとfactory_girl、let-variable呼び出しの前に作成されません。

正しいコードは次のとおりです。

# will test that get_count_for_list will return 5
describe ApiController do

  # why same name - seems really confusing!
  let!(:user) { FactoryGirl.create(:user) }
  let!(:user2) { FactoryGirl.create(:user2) }
于 2012-08-30T18:17:52.373 に答える