Rspe c присутствие: истинная проверка не работает, хотя она работает как задумано - PullRequest
0 голосов
/ 17 июня 2020

У меня есть следующий тест Rspe c со следующим выводом для моей модели User в Rails API, который я создаю:

RSpec.describe User, type: :model do
  let(:michael) { User.new(email: "michael@email.com", password: "Password1", password_confirmation: "Password1") }

    it 'is not valid without a password' do
      michael.password = ''
      expect(michael).not_to be_valid, "Expect User to have a Password"
    end

  end
  1) User basic checks is not valid without a password
     Failure/Error: expect(michael).not_to be_valid, "Expect User to have a Password"
       Expect User to have a Password
     # ./spec/models/user_spec.rb:19:in `block (3 levels) in <main>'

Однако по какой-то причине этот тест просто не проходит , даже со следующим на моей модели User

class User < ApplicationRecord
  has_secure_password
  validates :email, presence: true, uniqueness: true
  validates :password, presence: true
  validates :password,
            format: { with: /\A(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9]).{8,}\Z/, message: "Password must be at least 8 characters long, contain at least 1 uppercase and 1 lowercase letter and 1 number" },
            confirmation: true,
            on: :create
end

Вышеупомянутая проверка работает нормально, как вы можете видеть здесь:

➜ rails c
Running via Spring preloader in process 2774
Loading development environment (Rails 6.0.3.1)
irb(main):001:0> new = User.new
irb(main):002:0> new.email = "testing@testing.com"
irb(main):003:0> new.save
   (0.2ms)  BEGIN
  User Exists? (0.6ms)  SELECT 1 AS one FROM "users" WHERE "users"."email" = $1 LIMIT $2  [["email", "testing@testing.com"], ["LIMIT", 1]]
   (0.2ms)  ROLLBACK
=> false
irb(main):004:0> new.errors
=> #<ActiveModel::Errors:0x00007f743848dfb0 @base=#<User id: nil, email: "testing@testing.com", password_digest: nil, created_at: nil, updated_at: nil, admin: false>, @messages={:password=>["can't be blank", "can't be blank", "Password must be at least 8 characters long, contain at least 1 uppercase and 1 lowercase letter and 1 number"]}, @details={:password=>[{:error=>:blank}, {:error=>:blank}, {:error=>:invalid, :value=>nil}]}>

Что именно я делаю здесь не так, чтобы этот тест потерпеть поражение? Это до боли простой, и все остальные работают, как ожидалось, за исключением проверки пароля.

1 Ответ

1 голос
/ 17 июня 2020

Во-первых, в ваших тестах password = '' является допустимым, потому что для Ruby '' - это что-то. Вы должны добавить это в свою проверку: validates :password, presence: true, allow_blank: false

Также обратите внимание, ваш пароль проверяется для on: :create, а в вашем SPE c вы его не создаете.

...