1

我正在构建一个简单的测试来为用户展示产品。我的规格如下所示:

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 语法感到困惑。我怎样才能在一条线上生成多个产品,但工厂名称必须与模型匹配?

4

1 回答 1

1

实例变量 @products 很可能在 ProductsController 的 index 操作中分配,或者如果不是,它可能应该在那里定义。

通常,在请求规范中发生的情况是,您使用工厂创建一个持久保存在数据库中的对象,控制器随后检索这些记录并将它们分配给视图可用的实例变量。由于看起来您正在呈现索引,因此我希望在您的控制器中看到类似的内容:

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

此实例变量将在呈现时可供视图使用。

此外,您的视图中似乎有错字。在迭代器中,您有:

for product in @products
  # do something with product
end

这将遍历每一个产品,并使变量“产品”在块中可用。相反,您在块中使用@product,这似乎是一个错字。

于 2012-05-11T22:58:03.223 回答