0

我在使用 FactoryGirl 时遇到了这个问题。

每次我运行测试时,都会出现错误:未定义的方法 `to_i' for Array

我看不到它试图在哪里转换为整数。我最好的猜测是它试图将客户记录保存为数字,而不仅仅是保存记录的 ID。我尝试搜索文档以查看我是否错误地设置了工厂。

db:test:prepare希望是这样的。

你能看到哪里出了问题吗?

规格/工厂.rb

FactoryGirl.define do

  factory :client do
    name     "Example"
    email    "email@example.com"
  end

  factory :book do
    title    "Book Title"
    client_id  {[FactoryGirl.create(:client)]}
  end

end

规范/视图/书籍/index.html.erb_spec.rb

require 'spec_helper'

describe "books/index" do
  before do
    FactoryGirl.create(:book)
  end

  it "renders a list of books" do
    render
    # Run the generator again with the --webrat flag if you want to use webrat matchers
    assert_select "tr>td", :text => "Title".to_s, :count => 2
    assert_select "tr>td", :text => 1.to_s, :count => 2
  end
end

测试输出

  1) books/index renders a list of books
     Failure/Error: FactoryGirl.create(:book)
     NoMethodError:
       undefined method `to_i' for #<Array:0x########>
     # ./spec/views/books/index.html.erb_spec.rb:5:in `(root)'
4

1 回答 1

1

你在定义工厂时犯了一个错误。

不要FactoryGirl.create...在定义内调用。

假设 book 有很多客户(虽然这很奇怪),您可以在客户中提及 book。像这样

FactoryGirl.define do

  factory :client do
    name     "Example"
    email    "email@example.com"
    book # Revised here. book refers to the symbol :book
  end

  factory :book do
    title    "Book Title"
  end

end

就这样。你测试应该可以过去。

PS关于模型关联的旁注:

在您的环境中,一位客户只能拥有一本书!企业主不能通过这样的销售很快致富。正确的逻辑应该是:

一个客户可以有很多订单

一个订单可以有很多项目

一个项目只有一本书(id),但可能有很多部分。

但那是另一回事了。

于 2013-04-15T15:12:25.593 回答