【问题标题】:pagination breaks old rspec tests - render throws error分页打破了旧的 rspec 测试 - 渲染抛出错误
【发布时间】:2015-12-29 12:07:29
【问题描述】:

导轨 4,rspec 3

我正在使用分页和faker

下面是一个旧的测试用例,在我实施分页和伪造之前很好。

RSpec.describe "users/index", :type => :view do
  before(:each) do
    assign(:users, [
      User.create!(
        :name => "Name",
        :email => "Name@mail.com",
        :password => "mystrings"
      ),
      User.create!(
        :name => "Name",
        :email => "Name2@mail.com",
        :password => "mystrings"
      )
    ])
  end

  it "renders a list of users" do
    render
    assert_select "tr>td", :text => "Name".to_s, :count => 2
    assert_select "tr>td", :text => "Name@mail.com".to_s, :count => 1
    assert_select "tr>td", :text => "Name2@mail.com".to_s, :count => 1
  end
end

错误信息:

 1) users/index renders a list of users
     Failure/Error: render
     ActionView::Template::Error:
       undefined method `total_pages' for #<Array:0x007f90b55d7828>
     # /Users/xuanliu/.rvm/gems/ruby-2.1.3/gems/will_paginate-3.0.7/lib/will_paginate/view_helpers.rb:73:in `will_paginate'

除了使用render“刷新”当前页面,还有什么方法可以让我在视图上测试?

我认为我的另一个问题是类似的 - 也是关于正确使用 render

测试用例:

RSpec.describe "users/show", :type => :view do
  before(:each) do
    @user = assign(:user, User.create!(
      :name => "Name5",
      :email => "Name5@mail.com",
      :password => "mystrings"
    ))
  end

  it "renders attributes in <p>" do
    render
    expect(rendered).to match(/Name/)
    expect(rendered).to match(/Email/)
  end
end

错误信息:

2) users/show renders attributes in <p>
     Failure/Error: render
     ActionView::Template::Error:
       The @test variable appears to be empty. Did you forget to pass the collection object for will_paginate?
     # /Users/xuanliu/.rvm/gems/ruby-2.1.3/gems/will_paginate-3.0.7/lib/will_paginate/view_helpers/action_view.rb:94:in `infer_collection_from_controller'

感谢您的宝贵时间。

【问题讨论】:

  • 2018 这仍然是一个问题和解决方案:D

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


【解决方案1】:

错误 1

您收到此错误的原因是:

assign(:users, [
   User.create!(
     :name => "Name",
     :email => "Name@mail.com",
     :password => "mystrings"
   ),
   User.create!(
     :name => "Name",
     :email => "Name2@mail.com",
     :password => "mystrings"
   )
 ])

很可能在您的代码中,您通常将@users 分配给User.all 之类的东西 - 这将返回ActiveRecord::Relation 对象,它不是您分配的Array。您应该可以通过以下方式解决此问题:

User.create!(
   :name => "Name",
   :email => "Name@mail.com",
   :password => "mystrings"
 )
 User.create!(
   :name => "Name",
   :email => "Name2@mail.com",
   :password => "mystrings"
 )
assign(:users, User.all)

错误 2

显然你使用了@test 变量,你没有分配任何东西。不知道为什么在你的视图中有一个名为@test 的变量是不可能多说的。

【讨论】:

  • 我的代码中没有 @test 变量。我以为这是自动生成的东西..
  • 我尝试了您的解决方案,但无济于事。我还应该提到我使用了faker gem..不知道导致问题的原因。更新了问题。感谢您的宝贵时间。
【解决方案2】:

试试这个代码:

before(:each) do
  @user = assign(:user, User.create!(
    :name => "Name5",
    :email => "Name5@mail.com",
    :password => "mystrings"
  ))
  assign :user, user
  assign :test, user
end

【讨论】:

    猜你喜欢
    • 2011-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多