【问题标题】:RSpec - The passwords in my test are not matching upRSpec - 我的测试中的密码不匹配
【发布时间】:2013-05-12 07:09:19
【问题描述】:

我编写了一个测试来描述@user 和 found_user 通过密码匹配应该相同的情况。这也描述了它们何时不同。我没有使用设计或任何东西,而是使用has_secure_password 构建自己的身份验证

describe "return value of authenticate method" do
  before { @user.save }
  let(:found_user) { User.find_by(email: @user.email) }

  describe "with a valid password" do
    it { should eq found_user.authenticate(@user.password) }
  end

  describe "with an invalid password" do
    let(:user_for_invalid_password) { found_user.authenticate('invalid') }

    it { should_not eq user_for_invalid_password }
    specify { expect(user_for_invalid_password).to be_false }
  end
end

失败的部分是with a valid password 块。错误消息清楚地表明password_digest 不匹配

这是相关的输出:

expected: password_digest: "$2a$04$cDKhuWzsZuW8Gm4t5fJjpu6rmbwh10ZAt2Yae.BO0iuD...">
got: password_digest:      "$2a$04$jwfHjoLI0RpDIAEr9SMKGOZqeH.J5ILOkzalKCYQdDW4...">

我已经尝试删除之前块中的 @user.save 认为可能会解决它,但它没有。

我不确定他们为什么会出现不同的情况,或者我做错了什么。我对 rspec 和一般测试还很陌生。

我应该提到我的身份验证方法在 rails 控制台中工作。所以我有一种情况,应用程序代码可以工作,但测试失败了。

任何帮助将不胜感激。

我的用户类在这里:https://gist.github.com/DavidVII/f190d1f1e114234bb7d7

谢谢!

【问题讨论】:

  • 你删除了一些代码吗?我看不到你的 subject 块,它会告诉我 it 是什么。 . .这可能与您的错误消息有关。
  • 这里是完整的 user_spec.rb 文件,如果您有兴趣查看的话。 gist.github.com/DavidVII/f190d1f1e114234bb7d7
  • 谢谢,我看了一下。不错的开始。关于代码的一个稍微令人困惑的事情是describeit 块与subject 之间的不匹配。您不必使describe 匹配subject,但它确实有助于其他人阅读您的测试。但是,我认为这是另一个问题的主题。就像您隔离测试数据库的方式一样(您的测试结果让我怀疑您可能没有完全干净的测试数据库)。
  • 确实如此。我对测试相当陌生,所以感谢您对不匹配的建议。我正在为我的数据库使用 postgres,我觉得这比它的价值更麻烦,但我真的想要我在舞台上运行的本地数据库(heroku)。我将如何清理我的测试数据库?
  • 好的,这很奇怪。我清理了我的数据库并使用 db:schema:load 和 db:test:prepare 重建了它。这导致我的测试通过,但如果我再次运行它。它会失败。我觉得我在这里遗漏了一些非常明显的东西,但我不确定是什么。

标签: ruby-on-rails ruby postgresql authentication rspec


【解决方案1】:

您的测试不适用于 bcrypt 密码散列(我可以从字符串的形式中看出您正在使用什么),因为它会为每次密码更改生成一个新的随机盐。这是一件好事,不要改变这种行为。

所以你不应该编写测试来寻找存储的密码等于已知值。如果您打算在测试中这样做,或者由于使用has_secure_pasword 获得的所有抽象而意外地过度简化了测试,或者其他一些原因导致您使用当前代码,目前还不是 100% 清楚。

相反,您围绕密码处理的测试应该更加黑匣子,并断言您可以使用已知密码登录,而不是使用任何其他人登录(包括诸如 nils 之类的代码破坏情况、空字符串、超长密码和与哈希密码匹配的字符串)。

【讨论】:

  • 确实我正在使用 bcrypt。这很有意义,但我对 rspec 和一般测试还很陌生,所以我真的不知道如何接近它。你给我的东西已经足够好了。谢谢!
  • 另外,我想知道我是否可以编写一个可以验证用户变量的测试。像@user.authenticate('foobar') 这样的东西,然后确保它是有效的。
  • 我取消选中的原因是 Rails 教程手册(rails 4 版)按照我的方式进行操作并且通过了。这里唯一的区别是我在本地实例中使用的是 postgres 而不是 sqlite。显然,这与我的数据库有关,我不确定是什么。无论我做什么,我都无法通过考试。同样,这可能是因为我是测试新手,可能做的不对。
  • 这在技术上是正确的答案,因为这样做我们发现我的数据库存在另一个问题。也许在 SO 中的新帖子是有序的。谢谢,尼尔!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-12
  • 1970-01-01
  • 1970-01-01
  • 2013-08-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多