Тестирование MiniTest Model Failing - PullRequest
0 голосов
/ 24 апреля 2019

У меня есть модель «Политика».В этой модели у меня есть проверки присутствия для policy_holder и premium_amount.Я пытаюсь написать тест MiniTest для этой модели.По некоторым причинам мои тесты не проходят.Вот моя модель:

class Policy < ApplicationRecord
  belongs_to :industry
  belongs_to :carrier
  belongs_to :agent

  validates :policy_holder,  presence: true
  validates :premium_amount, presence: true
end

Вот мой контроллер:

class PoliciesController < ApplicationController
  def create
    policy = Policy.create!(policy_params)
    render json: policy
  end

  private
    def policy_params
      params.require(:policy).permit(:policy_holder, :premium_amount, :industry_id,
                                     :carrier_id, :agent_id)
    end
end

А вот мои тесты:

require 'test_helper'

class PolicyTest < ActiveSupport::TestCase
  test 'should validate policy holder is present' do
    policy = Policy.find_or_create_by(policy_holder: nil, premium_amount: '123.45',
                                      industry_id: 1, carrier_id: 1,
                                      agent_id: 1)
    assert_not policy.valid?
  end

  test 'should validate premium amount is present' do
    policy = Policy.find_or_create_by(policy_holder: 'Bob Stevens', premium_amount: nil,
                                      industry_id: 1, carrier_id: 1,
                                      agent_id: 1)
    assert_not policy.valid?
  end

  test 'should be valid when both policy holder and premium amount are present' do
    policy = Policy.find_or_create_by(policy_holder: 'Bob Stevens', premium_amount: '123.45',
                                      industry_id: 1, carrier_id: 1,
                                      agent_id: 1)
    assert policy.valid?
  end
end

Вот сообщение об ошибке:

Failure:
PolicyTest#test_should_be_valid_when_both_policy_holder_and_premium_amount_are_present [test/models/policy_test.rb:22]:
Expected false to be truthy.

Последний тест не пройден, когда я считаю, что он должен пройти.Это заставляет меня думать, что другие мои тесты тоже не верны.

Ответы [ 2 ]

1 голос
/ 24 апреля 2019

Существует гораздо более простой способ проверки валидаций с меньшим количеством «ковровых бомбардировок»:

require 'test_helper'

class PolicyTest < ActiveSupport::TestCase 
  setup do
    @policy = Policy.new
  end

  test "should validate presence of policy holder" do
    @policy.valid? # triggers the validations
    assert_includes(
      @policy.errors.details[:policy_holder],
      { error: :blank }
    )
  end

  # ...
end

Это тестирует только эту валидацию, а не каждую валидацию в модели вместе взятых.Использование assert policy.valid? не скажет вам ничего о том, что не удалось в сообщении об ошибке.

errors.details было добавлено в Rails 5. В более старых версиях вам нужно использовать:

assert_includes( policy.errors[:premium_amount], "can't be blank" )

Какиепроверяет фактическое сообщение об ошибке.Или вы можете использовать active_model-errors_details , который поддерживает функцию.

0 голосов
/ 24 апреля 2019

То, что здесь происходит, заключается в том, что проверки не выполняются в модели.

.valid? вернет true, если при выполнении проверок в объекте нет ошибок.

Поскольку вы ясно видите «ложь», это означает, что одна или несколько проверок в модели терпят неудачу.

В консоли Rails вам следует попробовать создать объект вручную и привести его к переменной, затемпроверяя его, чтобы увидеть ошибки следующим образом:

test = Policy.new(whatever params are needed to initialize here)
# This will give you the object

test.valid?
#This will likely return FALSE, and NOW you can run:

test.errors
#This will actually show you where the validation failed inside the object

Несмотря на это, это почти наверняка проблема в модели и ее создании.

Имейте в виду, .errors не будет работать, покаПОСЛЕ ТОГО, КАК вы запускаете .valid? на объекте.

...