2012-05-11 5 views
1

Je construis un test simple pour afficher le produit pour un utilisateur. Mon spec ressemble à ceci:Rails 3.2 RSpec test confusion avec FactoryGirl

require 'spec_helper' 

describe "Show Products" do 
    it "Displays a user's products" do 
    product = Factory(:product) 
    visit products_path 
    page.should have_content("ABC1") 
    end 
end 

et mon usine pour le produit ressemble à ceci:

FactoryGirl.define do 
    factory :product do 
    sequence(:identifier, 1000) {|n| "ABC#{n}" } 
    end 
end 

J'ai vue simple:

<table id="products"> 
    <thead> 
<th>Product ID</th> 
    </thead> 
    <tbody> 
    <% for product in @products %> 
     <tr> 
     <td><%= @product.identifier %></td> 
     </tr> 
    <% end %> 
    </tbody> 
</table> 

L'erreur que je reçois est que il n'y a pas de produits comme @products. Ben ouais. Et c'est ma question. Puisque mon usine est définie comme "produit" et qu'il y a une séquence, comment puis-je mettre les valeurs de "produit" dans une variable appelée "produits".

Je suis fondamentalement dérouté par la syntaxe FactoryGirl ci-dessus. Comment puis-je avoir plusieurs produits générés sur cette ligne, mais le nom de l'usine doit correspondre au modèle?

Répondre

1

La variable d'instance @products est très probablement affectée dans l'action d'index de votre ProductsController, ou elle devrait probablement y être définie si ce n'est pas le cas. En règle générale, dans les spécifications de requête, vous utilisez une fabrique pour créer un objet qui persiste dans la base de données. Le contrôleur récupère ensuite ces enregistrements et les affecte à une variable d'instance mise à la disposition de la vue. Comme il semble que vous rendre un index, je pense voir quelque chose comme ça dans votre contrôleur:

class ProductsController < ApplicationController::Base 
    def index 
    @products = Product.all 
    end 
end 

Cette variable d'instance sera disponible à la vue lorsqu'il est rendu.

En outre, il semble que vous ayez une faute de frappe dans votre vue. Dans le iterator vous avez:

for product in @products 
    # do something with product 
end 

Cela va itérer sur chacun des produits, et de faire la variable « produit » disponible dans le bloc. Au lieu de cela, vous utilisez @product dans le bloc, ce qui semble être une faute de frappe.

Questions connexes