【问题标题】:RSpec check the count of an arrayRSpec 检查数组的计数
【发布时间】:2017-12-12 18:09:41
【问题描述】:

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

  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?

【问题讨论】:

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


    【解决方案1】:

    试试

    expect(assigns(:products)).to_not be_empty
    

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

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

    因为整数响应positive?

    如果您想检查实际计数

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

    【讨论】:

    • 除了这些选项之外,您还可以创建自己的匹配器。这是一个例子。 gist.github.com/danielwestendorf/…
    • 谢谢乌苏斯。我确实发现了问题。我没有用数据播种我的测试数据库,所以我做对了,只是没有正确设置所有内容。嗯。
    【解决方案2】:

    你也可以把它改成如下:

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

    这允许您使用subject,例如:

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

    【讨论】:

    • 更好的答案,因为数组/对象内容使用这种方法显示在异常中
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多