Использовать объект, созданный внутри RSpe c ожидать блока в утверждении - PullRequest
1 голос
/ 25 мая 2020

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

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 сопоставителя, но тогда я не знаю, как чтобы проверить, правильный ли это экземпляр.

1 Ответ

0 голосов
/ 25 мая 2020

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

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

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

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

...