Rspec 如果在描述块中调用,为什么Factory Girl会创建副本
我使用Factory Girl和Faker创建独特的测试用户。 用户模型在电子邮件上具有唯一性验证 如果我嵌套两个级别的descripe块,那么一些测试将失败,因为存在重复的电子邮件。 如果我不嵌套描述块,那么所有工厂调用都返回唯一用户,测试通过 为什么Faker在第一个场景中会生成重复的电子邮件Rspec 如果在描述块中调用,为什么Factory Girl会创建副本,rspec,factory-bot,faker,Rspec,Factory Bot,Faker,我使用Factory Girl和Faker创建独特的测试用户。 用户模型在电子邮件上具有唯一性验证 如果我嵌套两个级别的descripe块,那么一些测试将失败,因为存在重复的电子邮件。 如果我不嵌套描述块,那么所有工厂调用都返回唯一用户,测试通过 为什么Faker在第一个场景中会生成重复的电子邮件 #工厂/user.rb #有骗子的简易工厂 工厂女孩 工厂:学生,班级:用户 first_name{Faker::name.first_name} 姓氏{Faker::name.last_name}
#工厂/user.rb
#有骗子的简易工厂
工厂女孩
工厂:学生,班级:用户
first_name{Faker::name.first_name}
姓氏{Faker::name.last_name}
密码{Faker::Lorem.words(3.join}
电子邮件{Faker::Internet.email}
结束
结束
#规格/型号/用户规格rb
#在此测试结构中,Faker返回重复的电子邮件
描述“嵌套的描述块”吗
请描述“块1”do
它“制造假货复制品”吗
10.5倍{
FactoryGirl.create(:学生)
}
结束
结束
描述“第2块”是什么
它“制造假货复制品”吗
10.5倍{
FactoryGirl.create(:学生)
}
结束
结束
结束
#在这种结构中,伪造电子邮件是独一无二的
描述“无嵌套描述块”是否
它“不会创建重复项”吗
10.5倍{
FactoryGirl.create(:学生)
}
结束
它“不会创建重复项”吗
10.5倍{
FactoryGirl.create(:学生)
}
结束
结束
Rspec返回以下错误:
Failure/Error: FactoryGirl.create(:student)
ActiveRecord::RecordInvalid:
Validation failed: Email has already been taken, Email has already been taken, Authentication token has already been taken
几个小时后,我的同事在桌子上敲打我的头,找到了答案: 结果证明,这些工厂不是交易性的。问题在spec_helper.rb的以下行之后消失:
config.use_transactional_fixtures = true
@正如您所说,我们需要在spec_helper.rb中进行以下配置
config.use_transactional_fixtures = true
但这还不够。我们需要将它添加到花括号中,以重新评估它,如下所示
auth_token { Faker::Lorem.characters(32) }
它不适用于:
auth_token Faker::Lorem.characters(32)
伪造者最终仍会生成重复的电子邮件。您可以使用序列或检查电子邮件是否不存在。请参见您是否介意发布错误输出?我获取了您的文件并在我的计算机上成功运行了它们,但在执行过程中,遇到了使用spork在后台运行Rails的问题,这使我无法获取工厂定义中的更改,并导致了与您看到的相同的验证错误。这是一个很长的过程,但是当您运行测试时,您确定Rails没有在其他进程中运行吗?另外,我觉得奇怪的是,你有多个错误短语,用逗号分隔。你知道为什么吗?最后,我建议更改测试,在每次创建记录后打印电子邮件地址以查找DUP。