Last active
December 3, 2017 12:43
-
-
Save stevo/0dfb6af87332646bc1d3ecbbe62cc4c8 to your computer and use it in GitHub Desktop.
RubyOnRails testing antipatterns - examples
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
describe CloseOrder do | |
describe '#call' do | |
it 'sends notification to customer and updates closed_at' do | |
order = create(:order) | |
service = CloseOrder.new(order) | |
allow(service).to receive(:send_notification) | |
allow(service).to receive(:update_closed_at_timestamp) | |
service.call | |
expect(service).to have_received(:send_notification) | |
expect(service).to have_received(:update_closed_at_timestamp) | |
end | |
end | |
describe '#send_notification' do | |
it 'delivers order closed notification to customer' do | |
order = create(:order, customer_email: 'tony@stark.com') | |
service = CloseOrder.new(order) | |
expect { | |
service.send(:send_notification)) | |
}.to change { ActionMailer.deliveries.count }.by(1) | |
notification = ActionMailer.deliveries.last | |
expect(notification).to have_attributes(subject: 'Order closed!', recipients: ['tony@stark.com']) | |
end | |
end | |
describe '#update_closed_at_timestamp' do | |
it 'updates closed_at with current time' do | |
order = create(:order) | |
service = CloseOrder.new(order) | |
travel_to(DateTime.new(2017, 1, 1, 12)) do | |
expect { | |
service.send(:update_closed_at_timestamp) | |
}.to change { order.reload.closed_at }.to(DateTime.new(2017, 1, 1, 12)) | |
end | |
end | |
end | |
end | |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
describe CloseOrder do | |
describe '#call' do | |
it 'delivers order closed notification to customer' do | |
order = create(:order, customer_email: 'tony@stark.com') | |
service = CloseOrder.new(order) | |
expect { | |
service.call | |
}.to change { ActionMailer.deliveries.count }.by(1) | |
notification = ActionMailer.deliveries.last | |
expect(notification).to have_attributes(subject: 'Order closed!', recipients: ['tony@stark.com']) | |
end | |
it 'updates closed_at with current time' do | |
order = create(:order) | |
service = CloseOrder.new(order) | |
travel_to(DateTime.new(2017, 1, 1, 12)) do | |
expect { | |
service.call | |
}.to change { order.reload.closed_at }.to(DateTime.new(2017, 1, 1, 12)) | |
end | |
end | |
end | |
end | |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class CloseOrder | |
def initialize(order) | |
@order = order | |
end | |
def call | |
update_closed_at_timestamp | |
send_notification | |
end | |
private | |
def update_closed_at_timestamp | |
@order.touch(:closed_at) | |
end | |
def send_notification | |
OrderMailer.order_closed_notification(@order).deliver_now | |
end | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment