RSpec测试索引视图和will_paginate

时间:2015-07-13 08:36:22

标签: ruby-on-rails rspec factory-bot will-paginate

我是使用Ruby测试的新手,我使用Rspec& FactoryGirl为此。

我想测试我的索引视图,其中显然有will_paginate

这是我的控制器:

def index
  @products = Product.paginate(:page => params[:page], :per_page=>30)
  respond_with(@products)
end

我有will_paginate的基本视图和产品表。

这是我的测试:

RSpec.describe "products/index", type: :view do
  before(:each) do
    @products = Array.new
    31.times do
      @products << FactoryGirl.create(:product)
    end
    assign(:products, @products)
  end

  it "renders a list of products" do
    render
  end
end

首先,它是正确的方法:创建一个数组,然后分配它?

如果我错了,请更正我但assign(:products, @products)相当于@products = Product.paginate(:page => params[:page], :per_page=>30) 以进行测试

2 个答案:

答案 0 :(得分:2)

我用这段代码绕过了我的问题:

RSpec.describe "products/index", type: :view do
  before(:each) do
    # Create a list of 31 products with FactoryGirl
    assign(:products, create_list(:product, 31))
  end

  it "renders a list of products" do
    allow(view).to receive_messages(:will_paginate => nil)
    render
  end
end

我对此解决方案有任何建议。

答案 1 :(得分:1)

不,这不一样。因为数组与具有Relation methods的ActiveRecord :: Relation不同(这是Product.paginate(:page => params[:page], :per_page=>30)返回的内容)。 也许是一种更好的方法,但这应该有效:

RSpec.describe "products/index", type: :view do
  before(:each) do
    @products = WillPaginate::Collection.new(4,10,0)
    31.times do
      @products << FactoryGirl.create(:product)
    end
    assign(:products, @products)
  end

  it "renders a list of products" do
    render
  end
end

此处@products = WillPaginate::Collection.new(4,10,0)在每页上创建一个包含4页和10个元素的集合。