【问题标题】:Rspec authenticate password test fails for no reasonRspec验证密码测试无缘无故失败
【发布时间】:2014-07-04 13:57:20
【问题描述】:

我正在学习 ruby​​ on rails 和 mongoDB (mongomapper),我跟着 Michael Hartl 的教程,遇到了一个问题。问题出在测试密码验证的某个地方。当我使用控制台并尝试身份验证时,它就像一个魅力,但是在运行测试时,相同的身份验证测试通过了前几次,然后突然失败告诉我数据库和变量中的密码不匹配。这是测试的代码和测试的消息。

spec/models/special_case.rb

require 'spec_helper'
require 'pry-debugger'

describe User do
  before do
      @user =  build(:user)
  end

  subject { @user }

  it { should respond_to(:authenticate) }

  it { should be_valid }

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

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

    describe "with 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
end

这是错误代码

bojan@bojan-300E4C-300E5C-300E7C:~/rubyprojects/sample_app$ bundle exec rspec spec/special_case.rb 
[DEPRECATION] :index option when defining key "email" is deprecated. Put indexes in `db/indexes.rb`
....F

Failures:

  1) User return value of authenticate method with valid password 
     Failure/Error: it { should eq found_user.authenticate(@user.password) }

   expected: #<User _id: BSON::ObjectId('53b6b0f6ac04d82c8e000003'), created_at: Fri, 04 Jul 2014 13:49:42 UTC +00:00, email: "boja00@yahoo.com", name: "Bojan Drljaca", password_digest: "$2a$04$Os57kzr4a/1.5Sf5KG5Ib.MV8xThCY0Tok8SiRVC/9b6vK8kiRFTi", updated_at: Fri, 04 Jul 2014 13:49:42 UTC +00:00>
        got: #<User _id: BSON::ObjectId('53b6b0f6ac04d82c8e000005'), email: "boja00@yahoo.com", name: "Bojan Drljaca", password_digest: "$2a$04$WGbfIKjDGvK/0nGPaAZXyuiH/z86MVIe0r6TWlQ72mIQw4XmRuR1m">

   (compared using ==)

   Diff:
   @@ -1,2 +1,2 @@
   -#<User _id: BSON::ObjectId('53b6b0f6ac04d82c8e000003'), created_at: Fri, 04 Jul 2014 13:49:42 UTC +00:00, email: "boja00@yahoo.com", name: "Bojan Drljaca", password_digest: "$2a$04$Os57kzr4a/1.5Sf5KG5Ib.MV8xThCY0Tok8SiRVC/9b6vK8kiRFTi", updated_at: Fri, 04 Jul 2014 13:49:42 UTC +00:00>
   +#<User _id: BSON::ObjectId('53b6b0f6ac04d82c8e000005'), email: "boja00@yahoo.com", name: "Bojan Drljaca", password_digest: "$2a$04$WGbfIKjDGvK/0nGPaAZXyuiH/z86MVIe0r6TWlQ72mIQw4XmRuR1m">

 # ./spec/special_case.rb:20:in `block (4 levels) in <top (required)>'

Finished in 0.10159 seconds
5 examples, 1 failure

Failed examples:

rspec ./spec/special_case.rb:20 # User return value of authenticate method with valid password 

Randomized with seed 5909

测试有时会通过,然后突然失败并告诉我密码不同(查看哈希)。

来自调试器的代码

[1] sample_app(#<RSpec::Core::ExampleGroup::Nested_1::Nested_1::Nested_1>) »  found_user
=> #<User:0x00000007cc18c8> {
            "_id" => BSON::ObjectId('53b6b7c1ac04d82e9b000003'),
     "created_at" => Fri, 04 Jul 2014 14:18:41 UTC +00:00,
          "email" => "boja00@yahoo.com",
           "name" => "Bojan Drljaca",
"password_digest" => "$2a$04$wg5lDkRFv2u4P90FZ.5EGesNedNr2IifDMiVT/iEU222llk.c8eea",
"updated_at" => Fri, 04 Jul 2014 14:18:41 UTC +00:00
}

[2] sample_app(#<RSpec::Core::ExampleGroup::Nested_1::Nested_1::Nested_1>) »  @user
=> #<User:0x0000000718f040> {
            "_id" => BSON::ObjectId('53b6b7e3ac04d82ea6000005'),
     "created_at" => nil,
          "email" => "boja00@yahoo.com",
           "name" => "Bojan Drljaca",
"password_digest" => "$2a$04$63/jTwT680HDjlQrUP/dVeTwtHb9.PRygGUTj9LoHypEuVesfEm3S",
     "updated_at" => nil
}

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-4 rspec mongomapper


    【解决方案1】:

    问题与密码无关。预期用户具有created_atupdated_at 属性,而实际用户没有。我猜你的found_user 永远不会被保存?

    另一种可能性是直接测试属性而不是整个用户:

    describe "with valid password" do
      let(:result) {found_user.authenticate(@user.password)}
    
      it 'should fetch the user' do  
        @user.email.should eq result.email
        @user.name.should  eq result.name
      end
    end
    

    【讨论】:

    • 它已保存,我在 mongo 控制台中检查了测试数据库。 created_at 和 updated_at 属性会自动插入时间戳!在 user.rb 中。这是来自调试器的代码,您可以看到 found_user 已正确保存。 @user 是比较(并保存到数据库中)的 var,而 found_user 来自数据库。
    • 您应该将该代码添加到原始帖子而不是 cmets - 这里太难阅读了。
    • 好吧,看来@user 没有保存——或者至少它有nilcreated_at/updated_at 值,而发现使用没有。将编辑我的答案
    猜你喜欢
    • 2011-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多