26

我正在尝试使用FactoryGirl/模拟会话shoulda(它与固定装置一起使用,但我在使用工厂时遇到问题)。我有以下工厂(用户登录和电子邮件都有unique验证):

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 中创建所有工厂?

轨道 2.3.5/should/FactoryGirl

4

1 回答 1

38

Factory(:user)Factory.create(:user)在您的设置中创建两个对象并将它们保存到数据库的快捷方式。

Factory.build(:user)将为您创建一条user记录而不将其保存到数据库中。

编辑

在您的session_user工厂中,您正在创建一个用户,然后在您的测试设置中创建另一个用户。FactoryGirl将创建一条新user记录,因为您在session_user工厂中有关联。

您可以user从对象中获取您的实例,session_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
于 2010-04-23T09:17:30.520 回答