Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.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
Ruby on rails 从我的应用程序代码中获取数据并输入我的rspec测试_Ruby On Rails_Ruby_Testing_Rspec_Automated Tests - Fatal编程技术网

Ruby on rails 从我的应用程序代码中获取数据并输入我的rspec测试

Ruby on rails 从我的应用程序代码中获取数据并输入我的rspec测试,ruby-on-rails,ruby,testing,rspec,automated-tests,Ruby On Rails,Ruby,Testing,Rspec,Automated Tests,我不确定如何在rspec中实现这种测试,或者它是否可能 我的具体场景是关于电子邮件确认: 1) user#save方法使用SecureRandom生成一个字节字符串(电子邮件确认码),对其进行加密,并将结果存储在数据库中。原始随机码(unhashed)也会通过电子邮件发送给用户 2) 我的user#confirm_email方法接收电子邮件确认码,并使用BCrypt对其进行散列,并将其与数据库中现有的散列进行比较。” 一切正常,但我不清楚如何测试该场景,因为#confirm_email的输入是随

我不确定如何在rspec中实现这种测试,或者它是否可能

我的具体场景是关于电子邮件确认:

1)
user#save
方法使用
SecureRandom
生成一个字节字符串(电子邮件确认码),对其进行加密,并将结果存储在数据库中。原始随机码(unhashed)也会通过电子邮件发送给用户

2) 我的
user#confirm_email
方法接收电子邮件确认码,并使用BCrypt对其进行散列,并将其与数据库中现有的散列进行比较。”

一切正常,但我不清楚如何测试该场景,因为
#confirm_email
的输入是随机的,在
#save
中创建,并且没有存储在我的测试可以访问的任何地方


在方法返回值之外,我的代码是否有一种干净的方法将信息传递给我的测试?我曾考虑将代码存储在临时文件中,然后从测试中读取文件,但我很好奇是否有更好的方法。

模拟将代码中的方法替换为测试中的某个方法。这正是你要做的

以为例,您可以在测试中编写:

allow(SecureRandom).to receive(:random_bytes).and_return("My Test String")
然后将相同的输入字符串用于您的
#确认_电子邮件
代码。假设您没有进行集成测试


对于仅测试
#confirm_email
方法,您可以首先使用已知的字节字符串在数据库中创建记录以创建加密数据。

请提供有关测试类型的更多信息。它是验收测试,并且要求是“黑箱”测试,还是较低级别的单元测试?没有理由不允许单元测试访问保存的代码或应用适当的模拟。在解释这一点时,一些测试代码和/或您想要测试的方法的代码可能会有所帮助。@NeilSlater-好的一点——测试不必是黑盒。我怎么能在这里使用mock?我曾经尝试过,但从未真正理解如何成功地使用它们。我的大多数测试只是练习代码,然后检查数据库中的输出或结果。谢谢你的帮助。