控制器规范中的rspec nil类错误

时间:2016-05-24 21:30:25

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

我有一个使用avatar attr和full_name方法的个人资料模型,该方法使用first_namelast_name个attrs。所有这些都在用户模型中委派。我真的不明白我怎么能得到零级错误。如果我删除了测试通过的图像标记行,那么用户不能为零,因为我也会调用user.full_name。我还有其他模型,我使用avatarfull_name,规格在那里工作正常。它也适用于开发环境。

我在这里想念的是什么?

所有3个块的

错误:

Failure/Error: <%= image_tag user.avatar.url(:small_thumb), class: "profile-index-avatar" %>

ActionView::Template::Error:
  undefined method `url' for nil:NilClass
  Did you mean?  URI

show.html.erb

<% @product.users.each_slice(2) do |user_row| %>
  <div class="row" style="padding-top:20px;">
    <% user_row.each do |user| %>
      <%= link_to user_profile_path(user) do %>
        <div class="col-md-6 product-user-column">
          <%= image_tag user.avatar.url(:small_thumb), class: "profile-index-avatar" %>
          <%= user.full_name %>
        </div>
      <% end %>
    <% end %>
  </div>
<% end %>

控制器规范

describe "GET show" do
  let!(:profile) { create(:profile, user: @user) }
  let!(:product) { create(:product, :product_with_nested_attrs) }
  let!(:product_user) { create(:product_user, user: @user, product: product, role: "owner") }
  before(:each) do
    get :show, id: product
  end

  it "assigns products" do
    expect(assigns(:product)).to eq(product)
    expect(assigns(:product).industry_products.size).to eq(1)
  end

  it { is_expected.to respond_with 200 }
  it { is_expected.to render_template :show }
end

更新

根据zetetic的建议,我检查了头像是否为零。对于索引操作,用户头像不是nil,也不是show action的头像。

如果将&#34;头像用于显示&#34;显示页面中的方法包含图像标记,然后它会像其他方式一样引发相同的错误。如果我删除图片标记行,则表示它不是零。

describe "GET index" do
  let!(:profile) { create(:profile, user: @user) }
  let!(:product) { create(:product, :product_with_nested_attrs) }
  before(:each) do
    get :index
  end

  it "avatar not nil for show" do
    expect(@user.avatar).to_not be_nil
  end

  it "assigns products" do
    expect(assigns(:products)).to eq([product])
  end

  it { is_expected.to respond_with 200 }
  it { is_expected.to render_template :index }
end

describe "GET show" do
  let!(:profile) { create(:profile, user: @user) }
  let!(:product_user) { create(:product_user, user: @user, product: product, role: "owner") }
  let!(:product) { create(:product, :product_with_nested_attrs) }
  before(:each) do
    get :show, id: product
  end

  it "avatar not nil for show" do
    expect(@user.avatar).to_not be_nil
  end

  it "assigns products" do
    expect(assigns(:product)).to eq(product)
    expect(assigns(:product).industry_products.size).to eq(1)
  end

  it { is_expected.to respond_with 200 }
  it { is_expected.to render_template :show }
end

1 个答案:

答案 0 :(得分:1)

对于其中一个用户,

avatar为零