Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

RSpec check the count of an array

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?

like image 417
Darkisa Avatar asked Dec 12 '17 18:12

Darkisa


2 Answers

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
like image 116
Ursus Avatar answered Nov 01 '22 20:11

Ursus


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) }
like image 36
schmijos Avatar answered Nov 01 '22 21:11

schmijos