2012-05-11 12 views
1

ユーザーのために製品を表示するための簡単なテストを構築しています。私のスペックは次のようになります。Rails 3.2 RSpecテストの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 

と製品のための私の工場は、次のようになります。

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

私は取得しています誤りがあることである:

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

が、私は単純なビューを持っています@productsのようなものはありません。まあ、そうだろう。それは私の質問です。私の工場は「製品」として定義されており、その中にシーケンスがあるので、「製品」からの値を「製品」という変数にどのように入れますか?

私は基本的に上記のFactoryGirl構文で混乱しています。 1行に複数の製品を生成するにはどうしたらいいですか?工場名はモデルに一致する必要がありますか?

答えて

1

インスタンス変数@productsは、ProductsControllerのインデックスアクションで割り当てられている可能性があります。そうでない場合は、おそらくそこに定義する必要があります。

一般に要求仕様では、ファクトリを使用してデータベースに保存されたオブジェクトを作成し、その後コントローラがそれらのレコードを取得し、ビューに使用可能にされたインスタンス変数に割り当てます。あなたは、インデックスをレンダリングしているように見えるので、私はあなたのコントローラ内でこのような何かを見ることが期待される:それがレンダリングされるとき

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

このインスタンス変数は、ビューに利用できるようになります。

また、あなたの見解に誤字があるようです。イテレータでは、持っている:これは、製品の一つ一つを反復処理し、ブロック内の変数「製品」を利用できるようになるだろう

for product in @products 
    # do something with product 
end 

。代わりにブロック内で@productを使用していますが、これは誤字のようです。