Techioz Blog

デフォルトスコープのRspec

概要

ユーザーモデル:

default_scope { where(:flg => '0') }
enum deleted_flg: { disabled: '1', enabled: '0' }

ユーザー仕様:

describe 'default scope' do
  it 'returns deleted_flg' do
    user = build(:user, first_name: 'Test', flg: "0")
    expect(user.deleted_flg).to eq "enabled"
  end
end

私が書いた仕様がデフォルトのスコープに対して正しいかどうかはわかりません。

助けていただければ幸いです。

解決策

「デフォルトのスコープ」は、モデルに対するすべての操作のマクロ (フィルターや並べ替え順序など) です。

たとえば、これが User というクラスにある場合は、次のように表示されることが予想されます。

User.all # => SELECT * FROM users WHERE deleted_flg = 0

2 つ以上のレコードを作成し、User.all が予期された順序で予期されたレコードを返すかどうかを確認することでテストできます (該当する場合)。例えば:

describe 'default scope' do
  it 'returns enabled users only' do
    enabled_user = create(:user, flg: '0')
    disabled_user = create(:user, flg: '1')
    expect(User.all).to eq [enabled_user]
  end
end

ボーナス:

enum の真の可能性を最大限に活用していないのです。重要なのは、これらの数値を「人間に優しい」方法で参照できることです。

例えば:

default_scope { where(flg: :enabled) }

# Or even:
default_scope { enabled }

そして:

disabled_user = create(:user, flg: :disabled)

詳細については、ドキュメントを参照してください。