Factory Girl с неявной ассоциацией has_many - PullRequest
1 голос
/ 02 февраля 2012

Я пытаюсь протестировать модель, которая имеет неявную ассоциацию has_many, и у меня возникли некоторые трудности.

У меня есть таблица A со столбцом B_ID, где B - это в основном внешний ключ - за исключением того, что в моей базе данных нет таблицы B или активного класса записей, связанного с объектом B. Есть также таблица C, в которой есть столбец a B_ID.

В модели для таблицы C имеем:

# implicit has_many :alphas
def alphas
   Alpha.where(:b_id => b_id).order(:xyz)
end

Эта структура базы данных имеет смысл для данных, которые у меня есть, и не тестовый код работает нормально.

Мой тестовый код почти работает, и я надеюсь, что мне не хватает чего-то простого.

У меня есть фабрики, определенные для A и C, и у меня есть тест:

a1 = Factory(:alpha, :b_id => 123, :xyz => 100)
a2 = Factory(:alpha, :b_id => 123, :xyz => 200)
c1 = Factory(:c, :b_id => 123)

puts c1.alphas.count
puts c1.alphas.first

c1.alphas.first.should == a1

Вывод:

2
nil
<test fails>

Изменение количества объектов A, которые разделяют B_ID, приводит к изменению c1.alphas.count, но я не могу на самом деле оказаться внутри неявной ассоциации и вернуть объект A - вместо этого я всегда получаю ноль. В моей модели C есть другие методы, которые я не могу протестировать, потому что эти методы должны обращаться к полям отдельных объектов A.

Кто-нибудь знает, что происходит за кулисами здесь, или что я мог бы сделать, чтобы обойти это? Благодаря.

1 Ответ

1 голос
/ 02 февраля 2012

Взгляните на это для примера, чтобы получить admin_user с ролью Admin.

https://github.com/drhenner/ror_ecommerce/blob/master/spec/factories/user.rb

В этом случае роли не являются заводскими.

Я считаю, что лучше всего сделать это следующим образом.

  @order = Factory(:order)
  order_item = Factory(:order_item, :total => 5.52 )
  @order.stubs(:order_items).returns([order_item, order_item])

или

  @order = Factory(:order)
  order_item = Factory(:order_item, :total => 5.52, :order => @order )
...