gpt4 book ai didi

ruby-on-rails - 工厂女孩什么时候在数据库中创建对象?

转载 作者:行者123 更新时间:2023-12-03 10:25:38 24 4
gpt4 key购买 nike

我正在尝试使用 FactoryGirl 模拟 session /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/shouda/FactoryGirl

最佳答案

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

关于ruby-on-rails - 工厂女孩什么时候在数据库中创建对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2697365/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com