RSpec check the count of an array

11,740

Solution 1

Try

expect(assigns(:products)).to_not be_empty

This works because the array responds to empty?. Another way could be

expect(assigns(:products).count).to be_positive

Because integers respond to positive?

While if you wanted to check an actual count

expect(assigns(:products).count).to eq 1

Solution 2

You could also turn it around a bit into the following:

expect(assigns(:products)).to have_attributes(count: be_positive)

This allows you to use subject, like this for example:

subject { assigns(:products) }

it { is_expected.to have_attributes(count: be_positive) }
Share:
11,740

Related videos on Youtube

Darkisa
Author by

Darkisa

Just a guy who likes to learn and who likes to help people learn

Updated on September 14, 2022

Comments

  • Darkisa
    Darkisa about 1 year

    I am testing my controller action for practice. In my controller, I just want to get all the distinct products by name from my database:

      def shop
        @products = Product.select('distinct on (name) *').sort_by &:order
      end
    

    I've checked this manually and it works fine. Now I am setting up my test using my RSpec and I want to test that @products is an array greater than 0:

    RSpec.describe PagesController, type: :controller do
      describe 'GET #shop' do
        it 'should get all proudcts' do
          get :shop
          expect(assigns(:products).count).to be > 0 
        end
      end
    end
    

    Now, I've tried several different combinations of the expect... but it keeps telling me that its either nil or 0, which I know it's not. How can I test that an array is greater 0?

  • Daniel Westendorf
    Daniel Westendorf almost 6 years
    Alternatively to these options, you can create your own matcher. Here is an example. gist.github.com/danielwestendorf/…
  • Darkisa
    Darkisa almost 6 years
    Thanks Ursus. I actually found the problem. I didn't seed my test database with data so I had it right, just didn't set everything up right. smh.
  • akostadinov
    akostadinov almost 2 years
    better answer, because array/object content is shown in exception using this approach