Kōhei Yamamoto

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

脚注

  1. ActionController::Base