0

我正在运行 Rails 3.2.11,并相信我已经安装了 minitest 规范和 capybara,并且通过我的 gem 文件和 test_helper.rb 正常工作

我有以下集成测试:

describe "Products integration" do
fixtures :users, :businesses
  it "shows product's name" do
    visit root_path
    fill_in "email", :with => users(:fu).email
    fill_in "password", :with => "secret"
    click_button "Log In"

    assert_equal products_path, current_path
  end
end

使用浏览器,一旦用户登录,他们就会被重定向到 products_path,其中显示了他们所有的产品。

我的示例用户夹具没有任何产品设置。因此,在我的 index.html.erb 中,该行<% if @products.present? %>应该为 false,并且不应尝试显示任何行数据。情况并非如此,我的测试失败了Error: undefined method type_name for nil:NilClass,因为它似乎试图写入表数据<td><%= product.product_type.type_name %></td>

导致 index.html.erb 的动作只包含@products = Product.includes(:product_type)

为什么对 products.present 的测试返回 true?并因此失败?

4

1 回答 1

0

啊,但不知何故至少有一种产品,否则你的错误将是

Error: undefined method product_type for nil:NilClass

因此,返回了一个具有 nil product_type 的非 nil 产品。

尝试放一个

puts @products.inspect

在您的规范中,也许这会提供一个线索,该产品是在哪里创建的。

此外,如果 product_type 永远不应为 nil,请在 db 中的该列上放置一个 NOT NULL 约束,以真正确保此类恶作剧是不可能的。ActiveRecord 级别的验证很有用,但可以通过多种方式规避,并且不能依赖于实际的数据完整性目的。

于 2013-04-11T11:51:23.407 回答