factory_girl не очень хорошо играет с rspec2 - ActiveRecord :: AssociationTypeMismatch - PullRequest
0 голосов
/ 02 декабря 2011

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

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

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

спецификация / интеграция / 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 Ответ

0 голосов
/ 02 декабря 2011

Вы можете иметь только один before(:all) в каждом файле спецификации.Используйте 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 перед (: все) `.

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

...