Использовать объект, созданный внутри блока ожидания 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
Вы также можете посмотреть документацию