Недефиниран метод „to_i“ за ‹Array:0x########› при тестване с използване на фабрики

Имам този проблем с FactoryGirl.

Всеки път, когато стартирам теста, той излиза с грешката: Недефиниран метод `to_i' за масив

Не мога да видя къде се опитва да преобразува в цяло число. Най-доброто ми предположение е, че се опитва да запази клиентския запис като число, вместо просто да запази идентификатора на записа. Опитах се да потърся документация, за да видя дали съм настроил фабриките си неправилно.

Пуснах рейк 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