Ruby on rails &引用;“电子邮件已被接收”;水豚和工厂女孩的错误

Ruby on rails &引用;“电子邮件已被接收”;水豚和工厂女孩的错误,ruby-on-rails,ruby-on-rails-3,testing,capybara,factory-bot,Ruby On Rails,Ruby On Rails 3,Testing,Capybara,Factory Bot,我认为这可能与这个问题有关 我不明白为什么在使用Factory Girl创建用户工厂时,Capybara无法在我的rails应用程序上测试注册表单。我不断收到一封电子邮件,邮件已被接收错误。这是我的工厂: FactoryGirl.define do sequence :email do |n| "email#{n}@example.com" end factory :user do email password "secret" password_c

我认为这可能与这个问题有关

我不明白为什么在使用Factory Girl创建用户工厂时,Capybara无法在我的rails应用程序上测试注册表单。我不断收到一封
电子邮件,邮件已被接收
错误。这是我的工厂:

FactoryGirl.define do
  sequence :email do |n|
    "email#{n}@example.com"
  end

  factory :user do
    email
    password "secret"
    password_confirmation "secret"
  end
end
这是我的注册测试:

require "test_helper"

describe "Signup integration" do

  before(:each) do
    visit signup_path
  end

  it "successfully routes to the signup page" do
    page.text.must_include "Sign Up"
  end

  it "signs up a new user" do
    user = FactoryGirl.create(:user)
    fill_in "user_email", :with => user.email
    fill_in "Password", :with => user.password
    fill_in "Password confirmation", :with => user.password_confirmation
    click_button "Create User"
    current_path == "/"
    page.text.must_include "Signed up!"
  end  
end
下面是我的test_helper.rb:

ENV["RAILS_ENV"] = "test"
require File.expand_path("../../config/environment", __FILE__)
require "minitest/autorun"
require "capybara/rails"
require "active_support/testing/setup_and_teardown"

class IntegrationTest < MiniTest::Spec
  include Rails.application.routes.url_helpers
  include Capybara::DSL
  register_spec_type(/integration$/, self)

  def last_email
    ActionMailer::Base.deliveries.last
  end

  def reset_email
    ActionMailer::Base.deliveries = []
  end
end

class HelperTest < MiniTest::Spec
  include ActiveSupport::Testing::SetupAndTeardown
  include ActionView::TestCase::Behavior
  register_spec_type(/Helper$/, self)
end

Turn.config.format = :outline

问题可能就在这方面

user = FactoryGirl.create(:user)
试着把它改成

user = FactoryGirl.build(:user)

FactoryGirl.create
创建用户对象的实例并将其保存到数据库中<代码>构建创建实例,但不将其保存到数据库。

问题可能出在这一行

user = FactoryGirl.create(:user)
试着把它改成

user = FactoryGirl.build(:user)

FactoryGirl.create
创建用户对象的实例并将其保存到数据库中<代码>构建创建实例,但不将其保存到数据库。

数据库清理器帮助了我

gemfile

  gem 'database_cleaner'
minitest_helper.rb

  class MiniTest::Spec
    include FactoryGirl::Syntax::Methods
    before :each do
      DatabaseCleaner.clean
    end
  end

数据库清洁器帮了我

gemfile

  gem 'database_cleaner'
minitest_helper.rb

  class MiniTest::Spec
    include FactoryGirl::Syntax::Methods
    before :each do
      DatabaseCleaner.clean
    end
  end

这是因为您对电子邮件列使用了相同的值,该值应该是唯一的

在gem文件中的
组:开发、测试
中使用
gem-fake
gem-database\u-cleaner


Fakers允许您为记录生成随机值,而
数据库\u cleaner
在创建记录后清理数据库

发生这种情况是因为您对电子邮件列使用相同的值,该值应该是唯一的

在gem文件中的
组:开发、测试
中使用
gem-fake
gem-database\u-cleaner


Fakers允许您为记录生成随机值,而
数据库\u cleaner
在创建记录后清理数据库

不使用databasecleaner?良好的实践是在运行测试之前在数据库中有一个定义良好的状态。否则很难预测结果。不使用databasecleaner?良好的实践是在运行测试之前在数据库中有一个定义良好的状态。否则很难预测结果。在
user=FactoryGirl.build(:user)
中使用
build
修复了注册测试。可以构建一个用户来测试注册过程,但我的登录测试仍然失败。使用
FactoryGirl.create(:user)
时失败,因为
电子邮件地址已被占用
。当我使用
user=FactoryGirl.build(:user)
时,它会失败,因为它无法正确提交登录表单。您是否需要使用
create
而不是build来测试登录,因为用户需要在数据库中登录?我将尝试添加数据库清理器来修复此问题。在
user=FactoryGirl中使用
build
。build(:user)
修复了注册测试。可以构建一个用户来测试注册过程,但我的登录测试仍然失败。使用
FactoryGirl.create(:user)
时失败,因为
电子邮件地址已被占用
。当我使用
user=FactoryGirl.build(:user)
时,它会失败,因为它无法正确提交登录表单。您是否需要使用
create
而不是build来测试登录,因为用户需要在数据库中登录?我将尝试添加数据库清理器来修复此问题。