Использовать объект, созданный внутри блока ожидания RSpec, в утверждении

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

class Identification < ApplicationRecord
  include Wisper::Publisher

  after_save :publish_identification_declined

  private

  def publish_identification_declined
    if status_previously_changed? && status == "declined"
      broadcast(:identification_declined, identification: self)
    end
  end
end

Я пытался сделать что-то подобное, но к сожалению identification_a заканчивается тем, что не устанавливается.

require "rails_helper"

RSpec.describe Identification do
  it "publish event identification_declined" do
    identification_a = nil
    expect { identification_a = create(:identification, :declined, id: 1) }
      .to broadcast(:identification_declined, identification: identification_a)
  end
end

Я также чувствую, что это может быть не самой хорошей идеей.

Альтернативой может быть использование instance_of matcher, но тогда я не знаю, как проверить, правильный ли это экземпляр.

1 ответ

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

Если вы хотите проверить, что функция вызывается, вы можете использовать receiveФункция rspec. Некоторым нравится:

require "rails_helper"

RSpec.describe Identification do
  subject { described_class.new(identification: nil, :declined, id: 1) }

  it "updates the state after save(or the event that should runs)" do
    expect { subject }.to receive(:publish_identification_declined)
    subject.save
  end
end

Вы также можете посмотреть документацию

Другие вопросы по тегам