Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 当我做rake db:test:prepare时,我的工厂是自动生成的`_Ruby On Rails_Rspec_Seed - Fatal编程技术网

Ruby on rails 当我做rake db:test:prepare时,我的工厂是自动生成的`

Ruby on rails 当我做rake db:test:prepare时,我的工厂是自动生成的`,ruby-on-rails,rspec,seed,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 e

当我运行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

对我来说毫无意义的是,我假设这些数据是事务性的。为什么我的工厂是在我准备数据而不是在每次测试中生成的?最合适的方法是什么?

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


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

你是说这个
工厂.rb
是在你做
测试:准备
时自动生成的吗,您能否共享堆栈跟踪的其余部分,以查看启动时是什么创建了这些数据库条目?没有任何信息。它显示了创建数据库的过程,然后显示了来自自定义rake命令的响应。没有提到工厂。啊,好吧,这是有道理的。在我运行rspec之前,不会创建工厂。但是,在测试完成后(我认为这是事务的定义),它们不会被删除工厂(即
factories.rb
文件)的创建不会导致任何对象的创建。如果您可以共享堆栈跟踪,我们可以看到是什么在创建对象(或者调用工厂,如果是这样的话)。数据库中真的没有
User
?如果是这样的话,那就意味着factory girl块在初始化过程中被执行了不止一次,并且您使用的序列机制不会产生唯一的电子邮件。