Тест проверки модели не работает в rspec

#ruby-on-rails #rspec

#ruby-on-rails #rspec

Вопрос:

Я хотел проверить, правильно ли работает проверка, поэтому я написал тест модели в Rspec.

модели/work_history.rb

 class WorkHistory < ApplicationRecord
  belongs_to :account

  validates :name,
            :since_date,
            :position, presence: true
  validates :is_employed, inclusion: [true, false]
  validates :until_date, presence: true, if: -> { :is_employed == false }
end
 

фабрики/work_histories.rb

 FactoryBot.define do
  factory :work_history do
    sequence(:name) { |n| "#{n}_company" }
    since_date { '2017-04-01' }
    until_date { '2021-03-01' }
    is_employed { false }
    position { 'director' }
    department { 'sales' }

    association :account
  end
end
 

spec/models/work_history_spec.rb

 RSpec.describe WorkHistory, type: :model do
  let(:account) { create(:account) }
  let(:work_history) { build(:work_history, account: account) }

  it "is invalid when is_employed is false and until_date is nil" do
    work_history.is_employed = false
    work_history.until_date = ''
    expect(work_history.valid?).to eq(false)
  end

  it "is invalid when is_employed is employed" do
    work_history.is_employed = 'employed'
    expect(work_history.valid?).to eq(false)
  end
end
 

затем я запускаю команду rspec, но тест не прошел.

это журнал ошибок теста rspec

 docker-compose run app rspec spec/models
Creating toei-works_app_run ... done
FF

Failures:

  1) WorkHistory is invalid when is_employed is false and until_date is nil
     Failure/Error: expect(work_history.valid?).to eq(false)

       expected: false
            got: true

       (compared using ==)

       Diff:
       @@ -1  1 @@
       -false
        true

     # ./spec/models/work_history_spec.rb:10:in `block (2 levels) in <top (required)>'

  2) WorkHistory is invalid when is_employed is employed
     Failure/Error: expect(work_history.valid?).to eq(false)

       expected: false
            got: true

       (compared using ==)

       Diff:
       @@ -1  1 @@
       -false
        true

     # ./spec/models/work_history_spec.rb:15:in `block (2 levels) in <top (required)>'
 

Я не знаю, почему тесты Rspec терпят неудачу

Почему я не могу пройти тест rspec?

Ответ №1:

Вы неправильно структурируете if-часть вашей проверки. В данный момент вы проверяете :is_employed? , равен ли символ false, чего он никогда не сделает. Вы можете проверить правильный синтаксис здесь:

https://guides.rubyonrails.org/active_record_validations.html#conditional-validation

Вы можете либо сделать

 class WorkHistory < ApplicationRecord
  belongs_to :account

  validates :name,
            :since_date,
            :position, presence: true
  validates :is_employed, inclusion: [true, false]
  validates :until_date, presence: true, if: -> { :not_employed? }

  private

  def not_enployed?
    !is_employed?
  end
end
 

или

 class WorkHistory < ApplicationRecord
  belongs_to :account

  validates :name,
            :since_date,
            :position, presence: true
  validates :is_employed, inclusion: [true, false]
  validates :until_date, presence: true, unless: Proc.new { |work_history| work_history.is_employed? }
end
 

Комментарии:

1. Спасибо, что вы ответили. Я реализовал его, как мне сказали, и он работал правильно!!