RSpec 関連のメモ

FactoryGirl で association を持つオブジェクトの生成

例として、User, Category に次のように association を持たせているとします。

# app/models/user.rb
class User < ActiveRecord::Base
  has_many :categories
  # ...
end

# app/models/category.rb
class Category < ActiveRecord::Base
  belongs_to :user
  # ...
end

ファクトリは次のように書きます。

# spec/factories/user.rb
FactoryGirl.define do
  factory :user do
    name 'Foo'
    email 'foo@example.com'
    password 'password'
    password_confirmation 'password'
  end
end

# spec/factories/categories.rb
FactoryGirl.define do
  factory :category do
    association :user
    name 'Bar'
  end
end

すると、次のように、スペック内で association で関連付けられたモデルを参照するオブジェクトを生成できます。

user = FactoryGirl.create(:user)

# user を参照する category を作成
let(:category) { FactoryGirl.create(:category, user_id: user.id) }

session controller のスペックで session を参照

ログイン処理を実装している(session[:user_id] へユーザ ID を保存しているとか) SessionsController#create へ、次のようにルーティングしているとします。

# config/routes.rb
post 'login' => 'sessions#create'

この session *1 は普通に参照できます。

describe 'POST #create' do
  let(:user) { create(:user) }
  let(:valid_parameters) do
    { email: user.email, password: user.password }
  end

  it 'saves the user ID to the session object' do
    post :create, session: valid_parameters

    # session[:user_id] で controller 内で設定している値を取り出し
    expect(session[:user_id]).to eq user.id
  end
end