【发布时间】: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
-
谢谢,我看了一下。不错的开始。关于代码的一个稍微令人困惑的事情是
describe和it块与subject之间的不匹配。您不必使describe匹配subject,但它确实有助于其他人阅读您的测试。但是,我认为这是另一个问题的主题。就像您隔离测试数据库的方式一样(您的测试结果让我怀疑您可能没有完全干净的测试数据库)。 -
确实如此。我对测试相当陌生,所以感谢您对不匹配的建议。我正在为我的数据库使用 postgres,我觉得这比它的价值更麻烦,但我真的想要我在舞台上运行的本地数据库(heroku)。我将如何清理我的测试数据库?
-
好的,这很奇怪。我清理了我的数据库并使用 db:schema:load 和 db:test:prepare 重建了它。这导致我的测试通过,但如果我再次运行它。它会失败。我觉得我在这里遗漏了一些非常明显的东西,但我不确定是什么。
标签: ruby-on-rails ruby postgresql authentication rspec