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