0

当我跑步时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

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

4

1 回答 1

1

好吧,一个问题是,在您的:brain工厂定义中,您实际上是FactoryGirl.create :user作为工厂定义的一部分调用的,而您大概是在调用工厂时调用它(即user {FactoryGirl.create :user})。

至于为什么User数据库中已经有一个,我不能回答这个问题,只能说有时即使你在打开事务的情况下运行并且事情变糟了,记录也可能会被留下。

于 2013-08-08T22:23:06.213 回答