Rspecで配列の値を検証するcontain_exactly
こんにちは!kossyです!
さて、今回はRspecで配列の値を検証するcontain_exactlyの使い方を
ブログに残してみたいと思います。
環境
Ruby 2.6.3
Rails 6.0.3.2
rspec-rails 4.0.1
使い方
前提として、TenantモデルとUserモデル(自己参照付き)があるとして、以下のscopeがUserモデルに定義されてあるとします。
scope :tenant_managers, -> (tenant_id) { where(tenant_id: tenant_id).where(manager_id: nil) }
このスコープのテストとして、
describe 'scopes' do describe 'tenant_managers -> (tenant_id)' do it '' do tenant = create :tenant manager_1 = create :user, tenant: tenant manager_2 = create :user, tenant: tenant user = create :user, tenant: tenant, manager: manager_1 expect(User.tenant_managers(tenant.id)).to include manager_1 expect(User.tenant_managers(tenant.id)).to include manager_2 expect(User.tenant_managers(tenant.id)).to_not include user end end end
とするテストケースもかけますが、contain_exactyマッチャを使うことで、
より簡潔に記述することができます。
describe 'scopes' do describe 'tenant_managers -> (tenant_id)' do it '' do tenant = create :tenant manager_1 = create :user, tenant: tenant manager_2 = create :user, tenant: tenant user = create :user, tenant: tenant, manager: manager_1 expect(User.tenant_managers(tenant.id)).to contain_exactly(manager_1, manager_2) end end end
contain_exactlyの引数に検証したい値を指定することで、動作の検証を行うことができます。
勉強になりました。