Testowanie observera czy wywołano wysyłanie maila

Witam
Testuje w ten sposób:

[code=ruby] ActiveRecord::Observer.with_observers(:trip_member_observer) do

      trip_member = build :trip_member

      TripMemberMailer.should_receive(:deliver_new_trip_member).with('some@email.com', trip_member)
    
      trip_member.save
    end
  end[/code]

Co może być nie tak, ponieważ test nie przechodzi. Sprawdzałem w teście i metoda ‘new_trip_member’ jest napewno wywoływana w mailerze.

:slight_smile: dosłownie minute po napisaniu posta znalazłem rozwiązanie, ale zostawie dla potomnych

TripMemberMailer.any_instance.should_receive(:new_trip_member)

Czemu po prostu nie używasz ActionMailer::Base.deliveries?

W moim przypadku jeden observer wysyła różne maile w zależności od stanu 2 rekordów. To rozwiązanie wydawało mi sie bardziej “eleganckie”, ponieważ mogę sprawdzić która metoda mailera została wywołana, zamiast np sprawdzać subject, który może się zmienić.

ps: dodatkowo widze w teście że w ActionMailer::Base.deliveries zaplątał sie także mail aktywacyjny użytkownika. Wychodzi na to że Sorcery “wysyła” go w teście nawet gdy w factory dla User mam activation_state “active”, nie wiem czy traktować to jako bug Socrery czy feature :slight_smile:

Ja bym to zapakował w jakąś service class. Łatwiej testować wtedy.