2016-04-28 13 views
0

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 MailerOrderObserverorder_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.

+0

zeigen, wie Sie testen –

+0

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

Antwort

0

fand ich eine Lösung (jede bessere Antwort ist klar,):

  1. Unsubscribe Zuhörer in Frage in RSpec config.before(:suite) Block , damit es nicht während der Tests keine Benachrichtigungen erhalten.

spec/spec_helper.rb

RSpec.configure do |config| 

    config.before(:suite) do 
    # unsubscribe observer 
    Rails.application.config.to_prepare do 
     Wisper.unsubscribe(MailerOrderObserver.new) 
    end 
    end 
end 
  1. Zuhörer Abonnieren nur für ausgewählte Tests.

spec/Beobachter/mailer_order_observer_spec.rb

require 'spec_helper' 

describe MailerOrderObserver, type: :model do 
    # ! prevents lazy loading 
    let! (:order) { create(:order, :with_items) } 

    describe '.order_after_save' do 
    before do 
     Wisper.subscribe(MailerOrderObserver.new) 
    end 

    it 'should send email' do 
     order.status = create(:status_released) 
     expect(order.save).to eq(true) 
    end 
    end 
end 

Auf diese Weise MailerOrderObserver nur Benachrichtigungen von Publisher erhält, wenn Wisper.subscribe... vor dem Test durchgeführt wird.

Beachten Sie, dass es bequem zu bedienen let! (mit Ausrufezeichen), um order zu instanziiert, bevor an die Wisper abonnieren möchte. Auf diese Weise wird nur eine Publisher-Benachrichtigung während des Tests empfangen. Wenn Sie stattdessen let verwenden, werden zwei Benachrichtigungen ausgelöst: eine nach create... und eine durch order.save verursachte.

Verwandte Themen