Back to list

RSpec - Unit Testing

Lv.51035@mukitaro10 playsDec 31, 2025

RSpec test with let, context, mocking, and expectations for behavior-driven testing.

preview.ruby
Ruby
1RSpec.describe OrderService do
2 describe '#process_order' do
3 let(:user) { create(:user) }
4 let(:product) { create(:product, price: 100) }
5 let(:order) { build(:order, user: user, items: [product]) }
6 let(:payment_gateway) { instance_double(PaymentGateway) }
7
8 subject(:service) { described_class.new(payment_gateway) }
9
10 before do
11 allow(payment_gateway).to receive(:charge).and_return(true)
12 end
13
14 context 'when payment succeeds' do
15 it 'creates the order' do
16 expect { service.process_order(order) }
17 .to change(Order, :count).by(1)
18 end
19
20 it 'charges the correct amount' do
21 service.process_order(order)
22 expect(payment_gateway).to have_received(:charge).with(100)
23 end
24 end
25
26 context 'when payment fails' do
27 before do
28 allow(payment_gateway).to receive(:charge).and_raise(PaymentError)
29 end
30
31 it 'raises an error' do
32 expect { service.process_order(order) }.to raise_error(PaymentError)
33 end
34 end
35 end
36end

Custom problems are not included in rankings