Неопределенный метод `to_i' для ‹Array:0x########› при тестировании с использованием фабрик

У меня есть эта проблема с использованием FactoryGirl.

Каждый раз, когда я запускаю тест, появляется ошибка: Undefined method `to_i' for Array

Я не вижу, где он пытается преобразовать в целое число. Я думаю, что он пытается сохранить запись клиента как число, а не просто сохранить идентификатор записи. Я попытался найти документацию, чтобы убедиться, что я неправильно настроил свои фабрики.

Я запустил rake db:test:prepare в надежде, что это было так.

Способны ли вы увидеть, что происходит не так?

spec/factories.rb

FactoryGirl.define do

  factory :client do
    name     "Example"
    email    "[email protected]"
  end

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

end

spec/views/books/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)'

person Crimbo    schedule 15.04.2013    source источник


Ответы (1)


Вы ошиблись в определении заводов.

Не вызывайте FactoryGirl.create... внутри определения.

Предположим, что у книги много клиентов (хотя это странно), вы можете просто упомянуть книгу внутри клиента. Так

FactoryGirl.define do

  factory :client do
    name     "Example"
    email    "[email protected]"
    book # Revised here. book refers to the symbol :book
  end

  factory :book do
    title    "Book Title"
  end

end

Это все. Вы тест должны быть в состоянии пройти.

P.S. Примечание об ассоциации модели:

В ваших условиях у одного клиента может быть только одна книга! Владелец бизнеса не может быстро разбогатеть, продавая таким образом. Правильная логика должна быть:

У клиента может быть много заказов

В заказе может быть много позиций

Предмет имеет только одну книгу (id), но может состоять из множества частей.

Но это уже другая история.

person Billy Chan    schedule 15.04.2013
comment
Спасибо! Да, я понимаю, что теперь я набросал упрощенный пример, чтобы показать, что пошло не так. Может быть, где-то люди одновременно делятся книгами :P ... Я отредактирую свой запрос. - person Crimbo; 15.04.2013