Ruby on rails 为什么此Rspec测试返回“0”;电子邮件已被接收”;

Ruby on rails 为什么此Rspec测试返回“0”;电子邮件已被接收”;,ruby-on-rails,rspec,factory-bot,Ruby On Rails,Rspec,Factory Bot,这是我的规范文件,当添加上下文测试“不作为信号更新用户平衡”时,我得到以下错误 require 'spec_helper' describe Sale do context 'after_commit' do context 'assignable' do sale = FactoryGirl.create(:sale, earned_cents: 10, assignable: true) after { sale.run_callbacks(:c

这是我的规范文件,当添加上下文测试“不作为信号更新用户平衡”时,我得到以下错误

require 'spec_helper'

describe Sale do 

  context 'after_commit' do

    context 'assignable' do 
      sale = FactoryGirl.create(:sale, earned_cents: 10, assignable: true)
      after { sale.run_callbacks(:commit) }

      it 'updates user balance' do
        sale.user.balance.should == sale.earned
      end
    end

    context 'not assignable' do 
      sale = FactoryGirl.create(:sale, earned_cents: 10, assignable: false)
      after { sale.run_callbacks(:commit) }

      it 'does not updates user balance' do
        sale.user.balance.should_not == sale.earned
      end
    end

  end 
end
工厂呢

require 'faker'

FactoryGirl.define do
  factory :user do
    email Faker::Internet.email
    password "mypassword"
  end

FactoryGirl.define do
  factory :sale do
    earned_cents 5
    user
  end
end
/spec/spec\u helper.rb
上,我也有这个

require 'database_cleaner'
RSpec.configure do |config|
  config.before(:suite) do
    DatabaseCleaner.strategy = :transaction
    DatabaseCleaner.clean_with(:truncation)
  end

  config.before(:each) do
    DatabaseCleaner.start
  end

  config.after(:each) do
    DatabaseCleaner.clean
  end
end
这就是我得到的错误

“保存!”:验证失败:已接收电子邮件(ActiveRecord::RecordInvalid)


我猜它与
Sale
工厂内的
user
引用有关,但我不知道为什么它不为第二次测试生成新用户或从数据库中删除它。有什么想法吗?

在您的用户工厂中,尝试以下方法:

factory :user do
  email { Faker::Internet.email }
  password "mypassword"
end
为什么必须用花括号括起来:以避免缓存值 运行
工厂(:user)
块 定义工厂时,而不是每次创建记录时。所以 如果
Factory::Internet.email
评估为
foo@bar.com
第一次, 然后,工厂将尝试创建所有后续用户 同样的电子邮件!)(根据@kristinalim,语法编辑)


工厂(:user)
块在定义工厂时运行,而不是每次创建记录时都运行。因此,如果
Factory::Internet.email
评估为“foo@bar.com“第一次,做
email Faker::Internet.email
就像做
email'foo@bar.com“
。组成块的大括号,是什么使此电子邮件生成方法能够在这种情况下多次重新运行。感谢@kristinalim和@schwabsauce解释了为什么此anwser是正确的;)