Условие макетной проверки Rspec в вспомогательных методах валидатора

#ruby-on-rails #rspec #factory-bot

#ruby-on-rails #rspec #factory-бот

Вопрос:

Есть ли какой-либо способ имитировать эти проверки условий без создания объекта доставки для каждого сценария

delivery.blank?

is_delivery_complete?

delivery.phone_number.blank?

delivery.customer_response.try(:service_instance_number).присутствует?

 module Bss
  module Helper
    module DeliveryValidator

      def validate_action

          return {
              valid: false,
              error_message: "delivery does not have a valid plan"
          } if delivery.blank?
 

           return {
              valid: false,
              error_message: "delivery is not complete"
          } if !is_delivery_complete?
         

           return {
              valid: false,
              error_message: "delivery does not have a mobile number"
          } if delivery.phone_number.blank?
         

           return {
              valid: false,
              error_message: "delivery has customer already created"
          } if delivery.customer_response.try(:service_instance_number).present?
 
        { valid: true }
      end


      def is_delivery_complete?
         !delivery.state_incomplete?
      end

    end
  end
end
 

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

1. Вы пробовали читать документы RSpec mocks? Это довольно прямолинейный сценарий издевательства, и я не вижу никаких попыток на самом деле решить эту проблему. relishapp.com/rspec/rspec-mocks/docs

2. Кроме того, я не вижу никаких веских причин, по которым вы хотели бы добавить 4 неопределенно связанные проверки в один валидатор. У вас есть 4 разных пути кода в одном методе, и это число, вероятно, будет просто расти. Валидатор должен проверять один единственный аспект модели, а не быть мусорным ящиком.

3. Да, это сложно подделать, поскольку валидатор имеет 4 разных пути кода. возможно, это требует некоторого рефакторинга перед написанием тестовых примеров. Спасибо за отзыв. Я использовал FactoryBot, кажется, хороший подход для создания экземпляра службы, который может проходить через 4 сценария, вместо того, чтобы писать активные записи запросов FactoryBot.define do factory:order do delivery_ref «00 #{Faker::Number.number(цифры: 11)}» состояние «доставлено» end end

4. Я бы начал все сначала и сначала написал тесты, а затем реализовал бы по одной проверке за раз в своей собственной проверке. Все эти проверки, кроме одной, могут быть выполнены с помощью встроенных проверок присутствия, если вы просто используете делегирование.

5. Возможно, вы захотите проверить github.com/thoughtbot/shoulda-matchers . Это дает вам доступ к большому синтаксису, такому как it { should validate_presence_of(:name) }