Rspec mongoid — тестирование обратного вызова встроенного документа (после сохранения)

#ruby #rspec #mongoid

#ruby #rspec #mongoid

Вопрос:

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

Код:

 class Post
  include Mongoid::Document
  include Mongoid::Timestamps::Created
  include Mongoid::Timestamps::Updated
  {....}
  # relations
  embeds_one :author, cascade_callbacks: true
  accepts_nested_attributes_for :author
  {...}
end

Class Author
  include Mongoid::Document
  include Mongoid::Timestamps::Created
  include Mongoid::Timestamps::Updated

  {...}
   embedded_in :post
   after_save    :my_callback_method

   def save_estimation_logs
     {...}
   end
  {...}
end
  

тест:

 RSpec.describe Author, :type => :model do
  context "Create author on Post" do
    let!(:post) { create(:post, :with_external_author) }
    it "should call after_save method my_callback_method when saving" do
      expect(post.author).to receive(:my_callback_method)
      expect(post.save).to eq true
    end
  end
end
  

когда я пытаюсь запустить этот rspec — я получил

 Failure/Error: expect(post.author).to receive(:my_callback_method)

   (#<Author _id: 5c7ea762f325709edac2ae84, created_at: 2019-03-05 16:44:18 UTC, updated_at: 2019-03-05 16:44:18 UTC>). my_callback_method(*(any args))
       expected: 1 time with any arguments
       received: 0 times with any arguments
  

Можете ли вы, ребята, помочь мне понять, как я должен протестировать эти обратные вызовы встроенного документа?

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

1. Какова точная ошибка.

2. Вы пытаетесь протестировать Rails и / или Mongoid-код. Мой совет — не делать этого. Просто полагайтесь на тот факт, что команды Rails и Mongoid написали достаточное количество тестов, и доверяйте этим тестам.

3. Zeitnot — точная ошибка в сообщении.

4. aridlehoover — я хочу убедиться, что обратный вызов after_save существует в модели (чтобы убедиться, что никто не удалит его по ошибке и так далее ..)

5. Затем протестируйте результат after_save .

Ответ №1:

Прежде всего, вы должны доверять mongoid вызову after_save и тестированию my_callback_method изолированно.

Теперь, как сказано в комментариях, что вы хотите проверить, удалил ли кто-то after_save , вы можете добавить тест для:

 RSpec.describe Author, :type => :model do
  context "Author" do
    it "should define my_callback_method for after_save" do
      result = Author._save_callbacks.select { |cb| cb.kind.eql?(:after) }.collect(amp;:filter).include?(:my_callback_method)
      expect(result).to eq true
    end
  end
end
  

Ответ №2:

Ваш код выглядит корректно, но в Mongoid есть ряд нерешенных проблем, связанных с обратными вызовами при сохранении. Убедитесь, что обратный вызов вызывается в обычном режиме (т. Е. при сохранении записи с консоли Rails).

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

1. Я проверил — это произошло, обратный вызов вызван, но я хочу поместить это в какой-то тест — но по какой-то причине я не нахожу никакой идеи, как это сделать.

2. Выполнили ли вы точно такие же операции, т. Е. создали сообщение с author (которое сохраняет оба), затем вызвали save для уже сохраненного сообщения (которое не внесло бы никаких значимых изменений в базу данных)?