2

我有两个 capybara 测试正在测试我的 rails 应用程序上的注册过程,都使用 factory girl。一种是使用 Factory Girl build 命令并将其保存为以下形式:

  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
4

1 回答 1

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

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

于 2013-04-22T19:30:34.583 回答