我有两个使用工厂女孩在我的rails应用程序上测试注册过程的capybara测试。一种是使用Factory Girl构建命令并使用以下格式保存:
it 'should create a user and associated customer_info', js: true do
visit signup_path
user = build(:user)
customer = build(:customer_info)
sign_up user, customer
page.should have_content 'Welcome back, ' + customer.firstname
end
而另一个使用create命令,然后尝试使用该信息登录。
it 'should be able to sign in', js: true do
user = create(:user)
customer = create(:customer_info, user_id: user.id)
visit new_user_session_path
fill_in 'user_email', with: user.email
fill_in 'user_password', with: user.password
click_button 'Sign in'
page.should have_content 'Welcome back, ' + customer.firstname
end
第一个传递并保存在我的测试数据库中。第二个失败,说“无效的电子邮件或密码”,但是当我在每次测试后检查我的数据库时,第一个保存记录但第二个保存记录(我假设它是为什么它说无效的电子邮件/密码)。
为什么我的FactoryGirl创建函数的想法实际上并没有将我的记录保存在数据库中?
修改
我在FactoryGirl的电子邮件定义中有一个序列,并且构建和创建都会增加序列,因此它不应该创建重复,对吗?
FactoryGirl.define do
factory :user do
sequence(:email) { |n| "foo#{n}@example.com"}
password "secret"
password_confirmation "secret"
end
end
答案 0 :(得分:2)
问题是您正在尝试创建重复的用户。注册在测试数据库中创建用户,现在当您尝试使用FactoryGirl创建新用户时,它会引发验证错误,因为测试数据库中已存在相同的用户。你应该这样做:
def create_user
@user ||= create(:user)
end
it 'should create a user and associated customer_info', js: true do
visit signup_path
@user = build(:user)
customer = build(:customer_info)
sign_up @user, customer
page.should have_content 'Welcome, ' + customer.firstname
end
it 'should be able to sign in', js: true do
create_user
customer = create(:customer_info, user_id: @user.id)
visit new_user_session_path
fill_in 'user_email', with: @user.email
fill_in 'user_password', with: @user.password
click_button 'Sign in'
page.should have_content 'Welcome back, ' + customer.firstname
end
可能是您可以使用不同的方法来解决它。但主要关注的是使用单个用户对象进行注册和登录。 希望这会对你有所帮助。