Skip to content

Instantly share code, notes, and snippets.

@stevo
Last active December 3, 2017 12:43
Show Gist options
  • Save stevo/0dfb6af87332646bc1d3ecbbe62cc4c8 to your computer and use it in GitHub Desktop.
Save stevo/0dfb6af87332646bc1d3ecbbe62cc4c8 to your computer and use it in GitHub Desktop.
RubyOnRails testing antipatterns - examples
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
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
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