Created
April 7, 2020 17:04
-
-
Save alexshagov/409e2709becb82a41fdfec8ce566ea8a to your computer and use it in GitHub Desktop.
RSpec more examples
This file contains hidden or 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
# ./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