RSpec 测试索引视图和 will_paginate

RSpec test index view and will_paginate

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

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

这是我的控制器:

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

我对 will_paginate 和 table 的产品有一个基本的看法。

这是我的测试:

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) for test ?

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

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

我愿意接受有关此解决方案的任何建议。

不,不一样。因为数组不同于 ActiveRecord::Relation 和 Relation methods(这就是 Product.paginate(:page => params[:page], :per_page=>30) returns)。 也许是更好的方法,但这应该有效:

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个元素。