当我做“rake db:test:prepare”时,我的工厂正在自动生成

时间:2013-08-08 20:49:20

标签: ruby-on-rails rspec seed

当我运行rake db:test:prepare时,

它自动生成我的工厂:

require 'ffaker'

FactoryGirl.define do

  factory :user do
    sequence(:email) {|i| "marley_child#{i}@gmail.com" }
    password 'secret_shhh'
  end

  factory :brain do
    user FactoryGirl.create :user
  end

end

然后,如果我尝试运行rspec甚至使用rails c test访问我的控制台,我会收到验证错误:

/activerecord-3.2.6/lib/active_record/validations.rb:56:in `save!': Validation failed: Email has already been taken (ActiveRecord::RecordInvalid)

我的Rspec:

  describe '#email' do
    context 'uniqueness' do
      let(:user) { FactoryGirl.build :user, email: 'Foo@Bar.COM' }
      subject { user.errors }
      before do
        FactoryGirl.create :user, email: 'foo@bar.com'
        user.valid?
      end
      its(:messages) { should include(email: ['has already been taken']) }
    end
  end

对我来说没有意义的是我认为这些数据是交易性的。为什么我的工厂在我准备数据时生成而不是在每个测试中生成?最合适的方法是什么?

1 个答案:

答案 0 :(得分:1)

嗯,有一个问题是,在你的:brain工厂定义中,当你想要在调用工厂时调用它时,你实际上正在调用FactoryGirl.create :user作为工厂定义的一部分(即user {FactoryGirl.create :user})。

至于为什么数据库中已经存在User,我无法回答这个问题,除非有时候即使您在开启交易并且事情向南的情况下运行,也可能会留下记录