Test :: Unit和.first方法

时间:2012-09-04 21:03:39

标签: ruby-on-rails ruby-on-rails-3

我有一个测试:

 def setup
    @cart = FactoryGirl.create(:cart_with_1_row)
  end

  test "should get show" do
    sign_in(FactoryGirl.create(:user, admin: true))
    FactoryGirl.create(:product_request)
    session[:cart_id] = @cart.id
    get :show, id: @cart.id
    assert_response :success
    assert_not_nil assigns(:product_requests)
  end

和控制器:

 def show
    cart = current_cart
    @product_requests = ProductRequest.find_all_by_cart_id(current_cart)
    cart.destroy
  end

除非我从我的观点中删除以下内容,否则会失败:

<h6><%= @product_requests.first.user.first_name %> <%= @product_requests.first.user.last_name %></h6>
<h6><%= @product_requests.first.street %></h6>
<h6><%= @product_requests.first.city %>, <%= @product_requests.first.state %> <%= @product_requests.first.zip %></h6>

错误是:

  1) Error:
test_should_get_show(CartsControllerTest):
ActionView::Template::Error: undefined method `user' for nil:NilClass

这意味着在.first上调用用户是否正在创建它?该页面在开发和生产环境中运行良好。

作为一个完整性检查,我将<%= product_request.user.first_name %>放在我的每个方法中,在ivar上,这是有效的。我是否正确地解释了这一点。首先是问题?

有问题的观点看起来像这样:

<h6><%= @product_requests.first.user.first_name %> <%= @product_requests.first.user.last_name %></h6>
    <h6><%= @product_requests.first.street %></h6>
    <h6><%= @product_requests.first.city %>, <%= @product_requests.first.state %> <%= @product_requests.first.zip %></h6

<% @product_requests.each do |product_request| %>
<%= product_request.user.first_name %>
<% end %>

1 个答案:

答案 0 :(得分:1)

你几乎就在那里 - 这里的问题是@product_requests是空的,所以@product_requests.first返回nil,而nil.first确实是问题。

我建议你验证current_cart本身不是零 - 这是我对原因的猜测。