Rails: Factory Girl не может секвенировать

Я только начал работать с фабричной девушкой и столкнулся с проблемой последовательности: в частности, она не увеличивается. Я пытался изменить тип базы данных, обновив factory_girl 1.3.2 до 2.0.0.beta1 (и factory_girl_rails с 1.0 до 1.1.0.beta1), попытался воссоздать базу данных, но та же проблема - последовательность не увеличивается и Я получаю сообщение об ошибке проверки после первой вставки уникального поля.

Любая помощь высоко ценится. Стек кода и трассировки ниже:

/spec/models/user.rb

require 'spec_helper'

describe User do   describe "test user factory is correct" do
    user = Factory(:user)

    it "should have an email ending in example.com" do
      #user.email.should match "[email protected]"
    end

    it "should have a password of foobar" do
      user.password.should == 'foobar'
    end

    it "should have a password confirmation field of foobar" do
      user.password_confirmation.should == 'foobar'
    end
    end

end

/spec/фабрики/user.rb

Factory.define :user do |f|
    f.sequence(:email) { |n| puts "Email ##{n}"; "factory_#{n}@example.com" }
    f.password 'foobar'
    f.password_confirmation { |p| p.password }
end

След:

/Users/john/.rvm/gems/ruby-1.9.2-p0/gems/activerecord-3.0.3/lib/active_record/validations.rb:49:in `save!': Validation failed: Email has already been taken (ActiveRecord::RecordInvalid)
    from /Users/john/.rvm/gems/ruby-1.9.2-p0/gems/activerecord-3.0.3/lib/active_record/attribute_methods/dirty.rb:30:in `save!'
    from /Users/john/.rvm/gems/ruby-1.9.2-p0/gems/activerecord-3.0.3/lib/active_record/transactions.rb:242:in `block in save!'
    from /Users/john/.rvm/gems/ruby-1.9.2-p0/gems/activerecord-3.0.3/lib/active_record/transactions.rb:289:in `block in with_transaction_returning_status'
    from /Users/john/.rvm/gems/ruby-1.9.2-p0/gems/activerecord-3.0.3/lib/active_record/connection_adapters/abstract/database_statements.rb:139:in `transaction'
    from /Users/john/.rvm/gems/ruby-1.9.2-p0/gems/activerecord-3.0.3/lib/active_record/transactions.rb:204:in `transaction'
    from /Users/john/.rvm/gems/ruby-1.9.2-p0/gems/activerecord-3.0.3/lib/active_record/transactions.rb:287:in `with_transaction_returning_status'
    from /Users/john/.rvm/gems/ruby-1.9.2-p0/gems/activerecord-3.0.3/lib/active_record/transactions.rb:242:in `save!'
    from /Users/john/.rvm/gems/ruby-1.9.2-p0/gems/factory_girl-1.3.2/lib/factory_girl/proxy/create.rb:6:in `result'
    from /Users/john/.rvm/gems/ruby-1.9.2-p0/gems/factory_girl-1.3.2/lib/factory_girl/factory.rb:327:in `run'
    from /Users/john/.rvm/gems/ruby-1.9.2-p0/gems/factory_girl-1.3.2/lib/factory_girl/factory.rb:270:in `create'
    from /Users/john/.rvm/gems/ruby-1.9.2-p0/gems/factory_girl-1.3.2/lib/factory_girl/factory.rb:301:in `default_strategy'
    from /Users/john/.rvm/gems/ruby-1.9.2-p0/gems/factory_girl-1.3.2/lib/factory_girl.rb:20:in `Factory'
    from /Users/john/Websites/Rails/InDevelopment/fastermanager/spec/models/user_spec.rb:5:in `block (2 levels) in <top (required)>'
    from /Users/john/.rvm/gems/ruby-1.9.2-p0/gems/rspec-core-2.3.1/lib/rspec/core/example_group.rb:131:in `module_eval'
    from /Users/john/.rvm/gems/ruby-1.9.2-p0/gems/rspec-core-2.3.1/lib/rspec/core/example_group.rb:131:in `subclass'
    from /Users/john/.rvm/gems/ruby-1.9.2-p0/gems/rspec-core-2.3.1/lib/rspec/core/example_group.rb:118:in `describe'
    from /Users/john/Websites/Rails/InDevelopment/fastermanager/spec/models/user_spec.rb:4:in `block in <top (required)>'
    from /Users/john/.rvm/gems/ruby-1.9.2-p0/gems/rspec-core-2.3.1/lib/rspec/core/example_group.rb:131:in `module_eval'
    from /Users/john/.rvm/gems/ruby-1.9.2-p0/gems/rspec-core-2.3.1/lib/rspec/core/example_group.rb:131:in `subclass'
    from /Users/john/.rvm/gems/ruby-1.9.2-p0/gems/rspec-core-2.3.1/lib/rspec/core/example_group.rb:118:in `describe'
    from /Users/john/.rvm/gems/ruby-1.9.2-p0/gems/rspec-core-2.3.1/lib/rspec/core/extensions/object.rb:6:in `describe'
    from /Users/john/Websites/Rails/InDevelopment/fastermanager/spec/models/user_spec.rb:3:in `<top (required)>'
    from /Users/john/.rvm/gems/ruby-1.9.2-p0/gems/activesupport-3.0.3/lib/active_support/dependencies.rb:235:in `load'
    from /Users/john/.rvm/gems/ruby-1.9.2-p0/gems/activesupport-3.0.3/lib/active_support/dependencies.rb:235:in `block in load'
    from /Users/john/.rvm/gems/ruby-1.9.2-p0/gems/activesupport-3.0.3/lib/active_support/dependencies.rb:225:in `block in load_dependency'
    from /Users/john/.rvm/gems/ruby-1.9.2-p0/gems/activesupport-3.0.3/lib/active_support/dependencies.rb:596:in `new_constants_in'
    from /Users/john/.rvm/gems/ruby-1.9.2-p0/gems/activesupport-3.0.3/lib/active_support/dependencies.rb:225:in `load_dependency'
    from /Users/john/.rvm/gems/ruby-1.9.2-p0/gems/activesupport-3.0.3/lib/active_support/dependencies.rb:235:in `load'
    from /Users/john/.rvm/gems/ruby-1.9.2-p0/gems/rspec-core-2.3.1/lib/rspec/core/configuration.rb:388:in `block in load_spec_files'
    from /Users/john/.rvm/gems/ruby-1.9.2-p0/gems/rspec-core-2.3.1/lib/rspec/core/configuration.rb:388:in `map'
    from /Users/john/.rvm/gems/ruby-1.9.2-p0/gems/rspec-core-2.3.1/lib/rspec/core/configuration.rb:388:in `load_spec_files'
    from /Users/john/.rvm/gems/ruby-1.9.2-p0/gems/rspec-core-2.3.1/lib/rspec/core/command_line.rb:18:in `run'
    from /Users/john/.rvm/gems/ruby-1.9.2-p0/gems/rspec-core-2.3.1/lib/rspec/core/runner.rb:55:in `run_in_process'
    from /Users/john/.rvm/gems/ruby-1.9.2-p0/gems/rspec-core-2.3.1/lib/rspec/core/runner.rb:44:in `run'
    from /Users/john/.rvm/gems/ruby-1.9.2-p0/gems/rspec-core-2.3.1/lib/rspec/core/runner.rb:10:in `block in autorun'

person PlankTon    schedule 20.12.2010    source источник
comment
Почему у вас есть два оператора внутри этого блока? f.sequence(:электронная почта) { |n| ставит Email ##{n}; factory_#{n}@example.com }   -  person Nathan Long    schedule 20.12.2010
comment
Вы пробовали делать tail -f log/test.log во время выполнения?   -  person Nathan Long    schedule 20.12.2010
comment
Вы используете автотест? Кроме того, какую стратегию очистки базы данных вы используете для очистки тестовой базы данных между запусками?   -  person Jesse Wolgamott    schedule 21.12.2010


Ответы (4)


Твоя проблема не с фабричной девушкой. При создании экземпляра «пользователя» вам нужно сделать это внутри блока «до», чтобы новый пользователь создавался для каждого запускаемого теста. Пользовательская переменная также должна быть переменной экземпляра (т. е. с префиксом @).

require 'spec_helper'

describe User do   

  describe "test user factory is correct" do

    before(:each) do
      @user = Factory(:user)
    end

    it "should have an email ending in example.com" do
      @user.email.should match "[email protected]"
    end

    it "should have a password of foobar" do
      @user.password.should == 'foobar'
    end

    it "should have a password confirmation field of foobar" do
      @user.password_confirmation.should == 'foobar'
    end

  end

end
person dmcnally    schedule 31.12.2010

С последним синтаксисом:

FactoryGirl.define do

  sequence :email { |n| "test#{n}@email.com" }

  factory :user do
    name          "John Doe"
    email         { FactoryGirl.generate(:email) }
  end

end
person vladiim    schedule 13.03.2012

Вы определили последовательность отдельно? Вот выдержка из одного из моих заводских файлов:

Factory.sequence(:email)       {|n| "person#{n}@example.com" }

Factory.define :user do |f|
  f.name                  "John Doe"
  f.email                 { Factory.next :email }
end
person Jason Morrison    schedule 20.12.2010
comment
(Я знаю, что FG поддерживает определение последовательностей, встроенных в фабрику, но было бы неплохо узнать, относится ли ваша проблема к встроенному синтаксису или относится к последовательностям, определенным с помощью более старого синтаксиса.) - person Jason Morrison; 21.12.2010

Я не уверен, почему это происходит, но вот пара предложений:

  1. Получить пользователя, который не сохранен в базе данных:

    пользователь = Factory.build (: пользователь)

Or,

  1. используйте a перед каждым блоком:

    до (: каждый) сделать @user = Factory (: пользователь) конец

    (затем измените переменные «user» на «@user»)

person coder_tim    schedule 20.12.2010