Объявление: child_key для ассоциаций has_many в factory_girl (datamapper) - PullRequest
0 голосов
/ 04 июля 2011

Я использую datamapper и postgres для моего приложения ror, в моих моделях у меня есть такие ассоциации:

#/models/account.rb
 has n, :transfers_out, "Transfer", :child_key => [ :account_from_id ]  
 has n, :transfers_in, "Transfer", :child_key => [ :account_to_id ]  

#/models/transfer.rb
 belongs_to :account_from, "Account", :child_key => [:account_from_id], :required => true
 belongs_to :account_to, "Account",   :child_key => [:account_to_id], :required => false

Теперь мне нужно протестировать в rspec с помощью Factory Girl.Итак, я написал это:

#/factories/account.rb
Factory.define :account do |f|
  f.transfers_out {|transfer| [transfer.association(:transfer)]}
  f.transfers_in  {|transfer| [transfer.association(:transfer)]}
  f.amount "0"
end

  Factory.define :account_big, :class => :account do |f|
    f.name "MyMillionDollarPresent"
    f.amount "10000"
  end

Factory.define :account_small, :class => :account do |f|
  f.name "PoorHomo"
  f.amount "100"
end 

и небольшая фабрика перевода

Factory.define :transfer do |f|
f.id "1"
f.comment  "payment"
f.status  "proposed"
f.amount "0"
end

Итак, я попытался проверить создание перевода со счета:

    describe Transfer do

  before(:each) do
    @account_big = Factory(:account_big)
    @account_small = Factory(:account_small)
    @transfer = Factory(:transfer)
  end

  it "should debit buyer" do
    @buyer = @account_big
    @buyer.transfers_out = @transfer
    @transfer.amount = 3000
    @buyer.amount -= @transfer.amount
    @buyer.amount.should == 7000
  end

Но это приводит меня к неудачному тесту:

 1) Transfer should debit buyer
     Failure/Error: @buyer.transfers_out = @transfer
     TypeError:
       can't convert Transfer into Array
     # ./spec/models/transfer_spec.rb:15:in `block (2 levels) in <top (required)>'

Итак, что мне делать и как мне объявить связь с дочерним ключом в этой ситуации?Был бы благодарен за любую помощь.

1 Ответ

1 голос
/ 05 июля 2011

@buyer.transfers_out - это массив, а @transfer - это отдельный объект.Если вы хотите создать массив с одним элементом, вы должны использовать @buyer.transfers_out = [ @transfer ] или что-то вроде @buyer.transfers_out << @transfer.

...