工厂女孩什么时候在db中创建对象?
我正在尝试使用FactoryGirl
/ shoulda
模拟会话(它与灯具一起工作但我在使用工厂时遇到问题)。 我有以下工厂(用户登录和电子邮件都有unique
validation):
Factory.define :user do |u| u.login 'quentin' u.email 'quentin@example.com' end Factory.define :session_user, :class => Session do |ses| ses.association :user, :factory => :user ses.session_id 'session_user' end
这是测试
class MessagesControllerTest < ActionController::TestCase context "normal user" do setup do @request.session[:user_id]=Factory(:user).id @request.session[:session_id]=Factory(:session_user).session_id end should "be able to access new message creation" do get :new assert_response :success end end end
但是当我运行rake test:functionals
,我得到了这个测试结果
1) Error: test: normal user should be able to access new message creation. (MessagesControllerTest): ActiveRecord::RecordInvalid: Validation failed: Account name already exists!, Email already exists!
这意味着当我在测试设置中引用它时,记录已存在于db中。 我有什么不明白的地方吗? FactoryGirl
在启动时是否在db中创建所有工厂?
rails 2.3.5 / shoulda / FactoryGirl
Factory(:user)
是Factory.create(:user)
的快捷方式,因此在您的设置中,您将创建两个对象并将它们保存到数据库中。
Factory.build(:user)
将为您创建user
记录而不将其保存到DB。
编辑
在您的session_user
工厂中,您正在创建一个用户,然后在您的测试设置中创建另一个用户。 FactoryGirl
将创建一个新的user
记录,因为您在session_user
工厂中有关联。
您可以从session_user
对象获取user
实例,如下所示: –
context "normal user" do setup do session = Factory(:session_user) @request.session[:session_id] = session.session_id @request.session[:user_id] = session.user_id end
或者您可以向user
工厂添加一些详细信息,以确保唯一的名称和电子邮件地址,如下所示: –
Factory.define :user do |u| u.sequence(:login) {|n| "quentin#{n}" } u.sequence(:email) {|n| "quentin#{n}@example.com"} end