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の引数に検証したい値を指定することで、動作の検証を行うことができます。




勉強になりました。