RSpec检查数组的计数

时间:2017-12-12 18:09:42

标签: ruby-on-rails ruby rspec rspec-rails

我正在测试我的控制器动作以进行练习。在我的控制器中,我只想从我的数据库中获取所有不同的产品名称:

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

我已经手动检查了它并且工作正常。现在我正在使用我的RSpec设置我的测试,我想测试@products是一个大于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

现在,我尝试了几种不同的期望组合...但它一直告诉我它的nil或0,我知道它不是。如何测试数组是否大于0?

2 个答案:

答案 0 :(得分:4)

尝试

expect(assigns(:products)).to_not be_empty

这是有效的,因为数组响应empty?。另一种方式可能是

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

因为整数会回复positive?

如果你想检查实际的数量

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

答案 1 :(得分:1)

您还可以将其更改为以下内容:

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

这允许您使用subject,例如:

subject { assigns(:products) }

it { is_expected.to have_attributes(count: be_positive) }