我正在构建一个简单的测试来为用户显示产品。我的规格看起来像这样:
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这样的东西。嗯,是的这是我的问题。由于我的工厂被定义为“产品”,并且其中有一个序列,如何将“product”中的值放入名为“products”的变量中。
我基本上对上面的FactoryGirl语法感到困惑。如何在该行上生成多个产品,但工厂名称必须与模型匹配?
答案 0 :(得分:1)
实例变量@products很可能是在ProductsController的索引操作中分配的,或者如果不是,则可能应该在那里定义它。
通常,请求规范中发生的是您使用Factory创建一个持久存储在数据库中的对象,然后控制器会检索这些记录并将它们分配给视图可用的实例变量。由于看起来你正在渲染索引,我希望在你的控制器中看到类似的内容:
class ProductsController < ApplicationController::Base
def index
@products = Product.all
end
end
渲染时,该实例变量可供视图使用。
此外,您的视图中似乎有拼写错误。在迭代器中你有:
for product in @products
# do something with product
end
这将迭代每个产品,并使块中的变量“product”可用。相反,你在块中使用@product,这似乎是一个错字。