当我运行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
对我来说没有意义的是我认为这些数据是交易性的。为什么我的工厂在我准备数据时生成而不是在每个测试中生成?最合适的方法是什么?
答案 0 :(得分:1)
嗯,有一个问题是,在你的:brain
工厂定义中,当你想要在调用工厂时调用它时,你实际上正在调用FactoryGirl.create :user
作为工厂定义的一部分(即user {FactoryGirl.create :user}
)。
至于为什么数据库中已经存在User
,我无法回答这个问题,除非有时候即使您在开启交易并且事情向南的情况下运行,也可能会留下记录