2012-05-11 2 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 

и моя фабрика для продукта выглядит следующим образом:

FactoryGirl.define do 
    factory :product do 
    sequence(:identifier, 1000) {|n| "ABC#{n}" } 
    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> 

Ошибка я получаю является то, что нет такой вещи, как @products. Ну, да. И это мой вопрос. Поскольку моя фабрика определяется как «продукт», и в ней есть последовательность, как мне помещать значения из «продукта» в переменную, называемую «продукты».

Я в основном смущен синтаксисом FactoryGirl выше. Как я могу создать несколько продуктов, сгенерированных в одной строке, но имя фабрики должно соответствовать модели?

ответ

1

Переменная экземпляра @products, скорее всего, назначается в действии индекса вашего ControlController, или, вероятно, его следует определить там, если это не так.

Как правило, в спецификации запроса используется Factory, чтобы создать объект, который сохраняется в базе данных, и контроллер впоследствии извлекает эти записи и присваивает их переменной экземпляра, которая становится доступной для представления. Так как это выглядит, как вы рендеринга индекс, я ожидал бы увидеть что-то вроде этого в контроллере:

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

Эта переменная экземпляра будет доступна для просмотра, когда он визуализируется.

Кроме того, похоже, что у вас есть опечатка на ваш взгляд. В итератора у вас есть:

for product in @products 
    # do something with product 
end 

Это будет перебирать каждый из продуктов, и сделать переменную «продукт» доступен в блоке. Вместо этого вы используете @product в блоке, который кажется опечаткой.

Смежные вопросы