Module: HttpDecoy::RSpec

Defined in:
lib/http_decoy/rspec.rb

Overview

RSpec integration.

Two equivalent usage patterns:

Pattern A — inline (per describe block):

RSpec.describe MyService do
  include HttpDecoy::RSpec

  fake_server(:payments) do
    post "/charges" do
      respond 201, json: { id: "ch_abc" }
    end
  end

  it "creates a charge" do
    MyService.charge(100)
    expect(fake_server(:payments)).to have_received_request(:post, "/charges").once
  end
end

Pattern B — suite-wide definition (most common):

FakeStripe = HttpDecoy.define(:stripe) do
  base_url "https://api.stripe.com"
  post "/v1/charges" do
    respond 200, json: { id: "ch_123" }
  end
end

RSpec.configure { |c| c.include FakeStripe.rspec_helpers }

it "charges the card" do
  StripeService.charge(500)
  expect(fake_server(:stripe)).to have_received_request(:post, "/v1/charges").once
end

Defined Under Namespace

Modules: ClassMethods

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.included(base) ⇒ Object



47
48
49
# File 'lib/http_decoy/rspec.rb', line 47

def self.included(base)
  base.extend(ClassMethods)
end

Instance Method Details

#fake_server(name) ⇒ Object

Instance-level accessor — returns the live Server for this example.



84
85
86
# File 'lib/http_decoy/rspec.rb', line 84

def fake_server(name)
  @_http_decoy_servers[name]
end

#with_scenario(scenario_name, server_name = nil) ⇒ Object

Run a block with a named scenario active. server_name defaults to the only server if exactly one is registered.

Raises:

  • (ArgumentError)


90
91
92
93
94
95
96
97
98
99
100
101
102
103
# File 'lib/http_decoy/rspec.rb', line 90

def with_scenario(scenario_name, server_name = nil, &)
  name = server_name || begin
    servers = @_http_decoy_servers || {}
    raise ArgumentError, "server_name required when multiple fake servers are active" if servers.size > 1
    raise ArgumentError, "No fake servers are active" if servers.empty?

    servers.keys.first
  end

  server = @_http_decoy_servers[name]
  raise ArgumentError, "No fake server named #{name.inspect}" unless server

  server.with_scenario(scenario_name, &)
end