Rails Factory Girl“创建”不保存记录?

时间:2013-04-22 19:13:29

标签: ruby-on-rails capybara factory-bot

我有两个使用工厂女孩在我的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

1 个答案:

答案 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

可能是您可以使用不同的方法来解决它。但主要关注的是使用单个用户对象进行注册和登录。 希望这会对你有所帮助。