我正在尝试使用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中创建所有工厂?
rails 2.3.5 / shoulda / FactoryGirl
答案 0 :(得分: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