我不确定如何在rspec中进行这种测试,或者甚至是否可能。
我的具体方案是关于电子邮件确认:
1)user#save
方法使用SecureRandom
生成字符串(电子邮件确认代码),对其进行Bcrypts,并将结果存储在数据库中。原始随机代码(未散列)也通过电子邮件发送给用户。
2)我的user#confirm_email
方法接收电子邮件确认代码并使用BCrypt对其进行哈希处理,并将其与数据库中的现有哈希进行比较。'
一切正常但我不清楚如何测试场景,因为#confirm_email
的输入是随机的,在#save
内创建,并且不存储在我的测试可以访问的任何地方。
在方法返回值之外,我的代码是否有一种干净的方式将信息传递给我的测试?我已经考虑将代码存储在临时文件中,然后从测试中读取文件,但我很好奇是否有更好的方法。
答案 0 :(得分:3)
Mocking用您测试中的某些内容替换代码中的方法。这正是你要求做的。
以rspec mocking framework为例,您可以在测试中写下:
allow(SecureRandom).to receive(:random_bytes).and_return("My Test String")
然后对#confirm_email
代码使用相同的输入字符串。假设您没有进行集成测试。
仅测试#confirm_email
方法,您可以先使用已知的字节字符串在数据库中创建记录,以创建加密数据。