Factory_girl не играет хорошо с rspec2 - ActiveRecord :: AssociationTypeMismatch

Я использую Rails 3.1.0rc8, Factory Girl 2.1.2, Factory Girl Rails 1.2.0 и RSpec 2.7.0.

Я считаю, что ошибка, которую я испытываю, связана с проблемами, обсуждаемыми в этой теме.

У меня есть спецификация, которая выглядит так:

spec/integration/my_integration_spec.rb:

require 'spec_helper'

describe 'A Workflow' do
 before(:all) do
 @reseller = Factory(:reseller)
 @product = Factory(:product, :reseller => @reseller)
 end

 describe 'A feature' do
 it 'Does something' do
 end

 describe 'A sub-feature' do
 before(:all) do
 # Error!
 @product.sold_at << Factory(:outlet, :reseller => @reseller)
 end

 it 'Does something' do
 end
 end
 end

Запуск этой спецификации вызывает исключение в подфункции:

Failure/Error: @product.sold_at << Factory(:outlet, :reseller => @reseller)
ActiveRecord::AssociationTypeMismatch:
 Reseller(#90828680) expected, got Reseller(#59351220)

Интересно, что эта ошибка не возникает, когда я перемещаю содержимое вложенного до крючка в первичный крючок.

require 'spec_helper'

describe 'A Workflow' do
 before(:all) do
 @reseller = Factory(:reseller)
 @product = Factory(:product, :reseller => @reseller)

 # No error!
 @product.sold_at << Factory(:outlet, :reseller => @reseller)
 end

 describe 'A feature' do
 it 'Does something' do
 end

 describe 'A sub-feature' do
 it 'Does something' do
 end
 end
 end

Был бы очень признателен за любую помощь в понимании этой проблемы.

1 ответ

У вас может быть только один before(:all) в каждом spec файле. Используйте before(:all) at the top of a spec and then перед (: каждый) in a describe block. This is the reason that your second example works, you have removed the second in a describe block. This is the reason that your second example works, you have removed the second до (: all) '.

Кроме того, будьте осторожны с before(:all). Любые данные, созданные здесь, не будут удалены из базы данных в конце спецификации, вам нужно будет удалить ее в after(:all) или использовать очиститель базы данных. См. Ссылку для рассуждений.

licensed under cc by-sa 3.0 with attribution.