Rails 3.2 RSpec测试与FactoryGirl的混淆

时间:2012-05-11 17:33:04

标签: ruby-on-rails-3 rspec2 factory-bot

我正在构建一个简单的测试来为用户显示产品。我的规格看起来像这样:

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语法感到困惑。如何在该行上生成多个产品,但工厂名称必须与模型匹配?

1 个答案:

答案 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,这似乎是一个错字。