Rails应用程序和Cucumber with Factory Girl中的验证失败错误

时间:2012-02-06 07:04:45

标签: ruby-on-rails devise cucumber factory-bot

我遇到以下错误:“验证失败:已使用电子邮件地址”,同时尝试运行Devise用户登录功能。

我怀疑问题出在工厂生成的用户身上,不知怎的,用同一个电子邮件地址创建了两次。我试图运行rake db:test:prepare以便重置测试数据库,遗憾的是,没有结果。

我的 user_factory.rb

Factory.define :user do |user|
  user.email "user_#{rand(1000).to_s}@example.com"
  user.password "password"
  user.confirmed_at nil
end

失败并出现验证错误的步骤“然后我应该注册并登录”“并且用户登录”。我的 signing_in.feature

Feature: Signing in
  In order to use the site
  As a user
  I want to be able to sign in

  Scenario: Signing in via confirmation
    Given there is an unconfirmed user
    And I open the email with subject "Confirmation instructions"
    And they click the first link in the email
    Then I should be registered and signed in

  Scenario: Signing in via form
    Given there is a confirmed user
    And I am on the homepage
    And user signs in
    Then I should see "Signed in successfully"

我的 user_steps.rb

def unconfirmed_user
  @unconfirmed_user = Factory(:user)
end


def sign_up user
  visit '/users/sign_up'
  fill_in('Email', :with => "unique@unique.com")
  fill_in('Password', :with => user.password)
  fill_in('Password confirmation', :with => user.password)
  click_button('Sign up')
end

def sign_in user
  visit 'users/sign_in'
  fill_in('Email', :with => user.email)
  fill_in('Password', :with => user.password)
  click_button('Sign in')
end

When /^I'm signing up$/ do
  sign_up unconfirmed_user
end

Given /^there is an unconfirmed user$/ do
  unconfirmed_user
end

Given /^there is a confirmed user$/ do
  unconfirmed_user.confirm!
end

Then /^I should be registered and signed in$/ do
  page.should have_content("Signed in as #{unconfirmed_user.email}")
end

Given /^user signs in$/ do
  sign_in unconfirmed_user.confirm!
end

When /^I open the email with subject "([^"]*?)"$/ do |subject|
  open_email(@unconfirmed_user.email, :with_subject => subject)
end

它可以是什么? 在此先感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

您应该在测试之间清除数据库,主要是使用database_cleaner。检查手册,因为配置因设置而异。我们正在使用这个(env.rb):

DatabaseCleaner.strategy = :truncation
Before do
  DatabaseCleaner.clean
end

此外,您应该删除工厂文件中的rand指令并使用FactoryGirl提供的好东西:

 u.sequence(:email){|n| "user_#{n}@example.com" }