Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rspec 如果在描述块中调用,为什么Factory Girl会创建副本_Rspec_Factory Bot_Faker - Fatal编程技术网

Rspec 如果在描述块中调用,为什么Factory Girl会创建副本

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}

我使用Factory Girl和Faker创建独特的测试用户。 用户模型在电子邮件上具有唯一性验证

如果我嵌套两个级别的descripe块,那么一些测试将失败,因为存在重复的电子邮件。 如果我不嵌套描述块,那么所有工厂调用都返回唯一用户,测试通过

为什么Faker在第一个场景中会生成重复的电子邮件

#工厂/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。