#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) }