Ruby on rails 当我做rake db:test:prepare时,我的工厂是自动生成的`
当我运行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
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块在初始化过程中被执行了不止一次,并且您使用的序列机制不会产生唯一的电子邮件。