RSpec 检查数组的个数

RSpec check the count of an array

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

  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

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

尝试

expect(assigns(:products)).to_not be_empty

这是可行的,因为阵列响应 empty?。另一种方式可能是

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

因为整数响应 positive?

而如果您想检查实际计数

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

您也可以将其稍微转换成以下内容:

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

这允许您使用 subject,例如:

subject { assigns(:products) }

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