Skip to content

Instantly share code, notes, and snippets.

@alexshagov
Created April 7, 2020 17:04
Show Gist options
  • Save alexshagov/409e2709becb82a41fdfec8ce566ea8a to your computer and use it in GitHub Desktop.
Save alexshagov/409e2709becb82a41fdfec8ce566ea8a to your computer and use it in GitHub Desktop.
RSpec more examples
# ./spec/user_spec.rb
require_relative '../../lib/user.rb'
require 'ostruct'
RSpec.describe User do
subject { described_class.new(name: name, payment_service: payment_service) }
let(:name) { 'John Doe' }
let(:success_result) { true }
let(:payment_service) { class_double('PaymentProcessingService') }
describe '#buy' do
let(:item) { double(amount: 100) }
before do
allow(payment_service).to receive(:charge!).and_return(OpenStruct.new(successfull: success_result))
end
context 'when payment was succesfull' do
let(:success_result) { true }
it 'calls payment service with correct parameters' do
expect(payment_service).to receive(:charge!).with(subject, item.amount).once
subject.buy(item)
end
it 'successfully buyes an item' do
expect { subject.buy(item) }.to change { subject.items.size }.by(1)
end
end
context 'when payment was unsuccessfull' do
let(:success_result) { false }
it 'does not buy an item' do
expect { subject.buy(item) }.to change { subject.items.size }.by(0)
end
end
end
end
# ./payment_service.rb
class PaymentProcessingService
class PaymentForbiddenError < StandardError; end
class << self
def charge!(user, amount)
puts "Real API call"
end
end
end
# PaymentProcessingService.charge!(user, amount)
# => OpenStruct(successfull: true/false)
# ./user.rb
require_relative 'payment_processing_service.rb'
class User
attr_reader :items, :payment_service
def initialize(name:, payment_service:)
@name = name
@payment_service = payment_service
@items = []
end
def buy(item)
payment_result = payment_service.charge!(self, item.amount)
@items << item if payment_result.successfull
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment