@Fly3110
web developer

Как в rspec заставить метод модуля вернуть то, что нужно с использованием нового синтаксиса?

Всем привет.

RSpec 3.8
Rails 5.2.1

Есть модуль:
module X
  included do
    after_create :test_method
  end

  def test_method
    ...
  end
end


и есть модель, которая этот метод использует:

class ParentModel < ApplicationRecord
  include X
end


также есть еще модель, которая является дочерней для ParentModel

class ChildModel < ApplicationRecord
  belongs_to :parent_model
end


В тестах модель ChildModel создается с помощью FactoryBot, что автоматически вызывает создание экземпляра модели родителя и вызов метода из модуля X.

Цель - заставить метод test_method вернуть то, что нужно.
Как это сделано сейчас:

parent_model = ParentModel.new
  allow(ParentModel).to receive(:new).and_return(parent_model)
  allow(parent_model).to receive(:test_method).and_return(true)

  child_model = FactoryBot.create(:child_model)


все работает, но, почему-то, не нравится :)
старый синтаксис RSpec позволяет использовать allow_any_instance_of, но они сами пишут, что это является code smell.

Как сделать более правильно? Или сейчас уже сделано все как надо?

Спасибо.
  • Вопрос задан
  • 231 просмотр
Решения вопроса 1
oh_shi
@oh_shi
Все нормально, сейчас именно такой синтаксис. allow_any_instance_of какое-то время будет выдавать сообщения, что он "deprecated". А через несколько версий его совсем уберут.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы