使用工厂测试时,<array:0x ########>的未定义方法`to_i'</array:0x ########>

时间:2013-04-15 12:54:21

标签: ruby-on-rails ruby-on-rails-3.2 factory-bot rspec-rails

我使用FactoryGirl时遇到此问题。

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

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

我已经运行了rake db:test:prepare,希望是这样。

你能看到出了什么问题吗?

规格/ factories.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)'

1 个答案:

答案 0 :(得分:1)

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

不要在定义中调用FactoryGirl.create...

假设书中有很多客户(虽然这很奇怪),你可以在客户端内提到书。喜欢这个

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

这就是全部。你测试应该能够过去。

P.S关于模型关联的附注:

在您的设置中,一个客户只能拥有一本书!通过这样的销售,企业主不能很快致富。一个合适的逻辑应该是:

客户可以有很多订单

订单可以包含多个商品

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

但那是另一个故事。