Witam, testuje observer czy po danej akcji wywołane zostanie wysłanie 2 maili,
[code=ruby]describe DateInvitationObserver do
before do
… @date_invitation = create :date_invitation, invitee: @invitee, inviter: @inviter, event: @event @date_invitation_mailer = mock(DateInvitationMailer)
end
it ‘should send emails to matched persons’ do
ActiveRecord::Observer.with_observers(:date_invitation_observer) do
DateInvitationMailer.stub(:date_matched_email).with(@invitee, @inviter, @event).and_return(@date_invitation_mailer) @date_invitation_mailer.should_receive(:deliver).exactly(2).times @date_invitation.accept!
end
end[/code]
Jednak dostaje błąd:
[quote]<DateInvitationMailer (class)> received :date_matched_email with unexpected arguments
Please stub a default value first if message might be received with other args as well.[/quote]
Jeśli zmienie linię na
Jeżeli oczekujesz, że dana metoda powinna zostać wywołana z określonymi parametrami to użyj should_receive
btw. to tylko kwestia gustu ale czemu nie używasz let() ?
[code]describe DateInvitationObserver do
let(:date_invitation) { create :date_invitation, invitee: @invitee, inviter: @inviter, event: @event }
let(:date_invitation_mailer) { mock :date_invitation_mailer }
before do
DateInvitationMailer.stub :date_matched_email => date_invitation_mailer
end
it ‘should send emails to matched persons’ do
ActiveRecord::Observer.with_observers(:date_invitation_observer) do
date_invitation_mailer.should_receive(:deliver).exactly(2).times
date_invitation.accept!
end
end[/code]
zmieniłem na coś takiego, testy zielone ale nie bardzo rozumiem czemu to działa a wcześniej nie chciało:
it 'should send emails to matched persons' do
DateInvitationMailer.stub date_matched_email: @date_invitation_mailer
DateInvitationMailer.stub(:date_matched_email).with(@invitee, @inviter, @event).and_return(@date_invitation_mailer)
@date_invitation_mailer.should_receive(:deliver).exactly(2).times
@date_invitation.accept!
end
DateInvitationMailer.stub date_matched_email: @date_invitation_mailer
DateInvitationMailer.stub(:date_matched_email).with(@invitee, @inviter, @event).and_return(@date_invitation_mailer)
nie powinno być
#stub wymusza to co obiekt ma zwrócić a #should_receive sprawdza czy metoda została wywołana, z jakimi parametrami i ewentualnie można powiedzieć co ma zwrócić