2016-05-14 9 views
2

app/views/products/index.html.erb:Verwendung eines anderen Modells im Hinblick auf Testfehler verursachen

<p id="notice"><%= notice %></p> 

<%= render 'search' %> 

<h1>Listing Products</h1> 

<br> 

<%= will_paginate @products %> 
<% if @products.present? %> 

<table> 
    <thead> 
    <tr> 
     <th>Title</th> 
     <th>Description</th> 
     <th>Image</th> 
     <th>Price</th> 
     <th>Category</th> 
     <th colspan="3"></th> 
    </tr> 
    </thead> 

    <tbody> 
    <% @products.each do |product| %> 
     <tr> 
     <td><%= product.title %></td> 
     <td><%= product.description %></td> 
     <td><%= image_tag product.photo.url(:small) %></td> 
     <td><%= number_to_currency(product.price, :unit => '$') %></td> 
     <td><%= link_to Category.find(product.category_id).name, category_path(product.category_id) %></td> 
     <td><%= link_to 'Show', product %></td> 
     <% if current_user.try(:admin?) %> 
      <td><%= link_to 'Edit', edit_product_path(product) %></td> 
      <td><%= link_to 'Destroy', product, method: :delete, data: { confirm: 'Are you sure?' } %></td> 
     <% end %> 
     <td><a href="/cart/<%= product.id %>">Add To Cart</a></td> 
     </tr> 
    <% end %> 
    </tbody> 
</table> 

<% else %> 
    <% if params[:search].present? %> 
     <p>There are no products containing the term(s) <b><%= params[:search] %></b>.</p> 
    <% else %> 
     <p>There are no any products found in database.</p> 
    <% end %> 
<% end %> 

<br> 
<% if current_user.try(:admin?) %> 
    <%= link_to 'New Product', new_product_path %> 
<% end %> 

app/views/products/show.html.erb:

<p id="notice"><%= notice %></p> 

<p> 
    <strong>Title:</strong> 
    <%= @product.title %> 
</p> 

<p> 
    <strong>Description:</strong> 
    <%= @product.description %> 
</p> 

<p> 
    <strong>Image:</strong> 
    <%= image_tag @product.photo.url(:original) %> 
</p> 

<p> 
    <strong>Price:</strong> 
    <%= @product.price %> 
</p> 

<p> 
    <strong>Category:</strong> 
    <%= @product.category.name %> 
</p> 

<%= social_share_button_tag(@product.title, :url => request.original_url, :image => root_url + @product.photo.url(:small), desc: @product.description, via: "SCOR") %> 

<% if current_user.try(:admin?) %> 
    <%= link_to 'Edit', edit_product_path(@product) %> | 
<% end %> 
<%= link_to 'Back', products_path %> 

Meine Tests in Test/controllers/product_controller_test.rb

test "should get index" do 
    get :index 
    assert_response :success 
    assert_not_nil assigns(:products) 
    end 

    test "should show product" do 
    get :show, id: @product 
    assert_response :success 
    end 

Verursachung diese Fehler:

1) Error: 
ProductsControllerTest#test_should_get_index: 
ActionView::Template::Error: Couldn't find Category with 'id'=1 
    app/views/products/index.html.erb:31:in `block in _app_views_products_index_html_erb___969781135508440478_70267650596940' 
    app/views/products/index.html.erb:25:in `_app_views_products_index_html_erb___969781135508440478_70267650596940' 
    test/controllers/products_controller_test.rb:15:in `block in <class:ProductsControllerTest>' 


    2) Error: 
ProductsControllerTest#test_should_show_product: 
ActionView::Template::Error: undefined method `name' for nil:NilClass 
    app/views/products/show.html.erb:25:in `_app_views_products_show_html_erb___1500506684449289207_70267650787820' 
    test/controllers/products_controller_test.rb:36:in `block in <class:ProductsControllerTest>' 

Ich bin mit meinen Tests mit rake test:functionals. Die anderen Tests für create, update und destroy funktionieren, aber ich bekomme Fehler von den Tests für index und show action.

Wie Sie sehen können, verwende ich Categories Modell in der Ansicht Produkte und offensichtlich verursacht es diese Fehler. Wie kann ich dieses Problem lösen?

Ich meine diese Linien in Ansichten sind problematisch:

<td><%= link_to Category.find(product.category_id).name, category_path(product.category_id) %></td> 

und

<%= @product.category.name %> 

Wenn Sie das gesamte Projekt aussehen soll: https://github.com/mertyildiran/SCOR

Antwort

1

In Ihrer Produkte Armaturen, Sie definieren ein Produkt mit einer category_id = 1

Wenn Sie laufen

ersetzen:

category_id: 1 

von

category: one 

warum 'one' Ihre Tests kann es nicht eine Kategorie mit id = 1

in test/fixtures/products.yml finden? weil in test/fixtures/categories.yml definieren Sie eine Kategorie ein markiertes:

one: 
    name: New T-Shirts 
    desc: Example category description 

Sie sollten stattdessen nicht Referenz-ID in Vorrichtungen, die Verwendung Verbände.

Ein schöner Beitrag zu diesem Thema: http://blog.bigbinary.com/2014/09/21/tricks-and-tips-for-using-fixtures-in-rails.html

Außerdem sollten Sie ersetzen:

link_to Category.find(product.category_id).name, category_path(product.category_id) 

von

link_to product.category.name, category_path(product.category) 
+0

Es allem auf magische Weise gelöst, vielen Dank :) –

+0

ich Ich bin froh, dir helfen zu können – Fred

Verwandte Themen