Ich benutze Rails Wisper Juwel und ich möchte Listener Callback ausführen (die E-Mail sendet) nur während bestimmter Tests (wo ich E-Mail senden testen). Bei anderen Tests möchte ich keine E-Mails senden, auch wenn sie in der Produktion von meinem Callback gesendet werden.Rails Wisper überspringen Listener Callback
Ist es mit Wisper möglich?
Verlag (app/models/order.rb)
class Order < ActiveRecord::Base
include Wisper::Publisher
after_save do
publish(:order_after_save, self)
end
end
Hörer/Betrachter (app/Beobachter/mailer_order_observer.rb)
class MailerOrderObserver
def order_after_save order
if order.status_id_changed? && order.status.notify?
# send email
end
end
end
Abonnement (config/Initialisierer/wisper.rb)
Rails.application.config.to_prepare do
Wisper.clear if Rails.env.development? || Rails.env.test?
# add observers
Wisper.subscribe(MailerOrderObserver.new)
end
Test (spec/Beobachter/mailer_order_observer_spec.rb)
require 'spec_helper'
describe MailerOrderObserver, type: :model do
let (:order) { create(:order, :with_items) }
it 'should send email' do
order.status = create(:status_released)
# emails are handled by external service, line below just triggers
# sending
expect(order.save).to eq(true)
end
end
ich den Test oben I MailerOrderObserver
order_after_save
Rückruf ausführen möchten, aber nicht in anderen Tests (viele "Aufträge" erstellt und geändert, was würde normalerweise E-Mail senden).
Ich verwende RSpec als Test-Framework und FactoryGirl.
Natürlich erstellen neue Order
Instanzen mit FactoryGirl löst Mailing, was auch nicht gewünscht ist.
zeigen, wie Sie testen –
Sie wäre besser dran, den Hörer auf eine Instanz eines Publishers (zB 'order.subscribe (MailerOrderObserver.new)') anstelle von global zu abonnieren (dh 'Wispersubscribe (MailerOrderObserver.new) '). Ansonsten bekommen Sie nur die gleichen Probleme wie reguläre ActiveRecord Callbacks (sie können nicht ausgeschaltet werden). – Kris