Module: HttpDecoy::Minitest

Defined in:
lib/http_decoy/minitest.rb

Overview

Minitest integration. Same server lifecycle and semantics as HttpDecoy::RSpec (fresh Server per test, WebMock stub scoped to that server, teardown never calls WebMock.reset!) hooked into Minitest's setup/teardown instead of RSpec's before/after.

Pattern A — inline (per test class):

class ChargeTest < Minitest::Test
include HttpDecoy::Minitest

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

def test_creates_a_charge
  MyService.charge(100)
  assert_received_request fake_server(:payments), :post, "/charges"
end
end

Pattern B — suite-wide definition (shared with RSpec):

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

class ChargeTest < Minitest::Test
include FakeStripe.minitest_helpers

def test_charges_the_card
  StripeService.charge(500)
  assert_received_request fake_server(:stripe), :post, "/v1/charges"
end
end

Defined Under Namespace

Modules: Assertions, ClassMethods

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.included(base) ⇒ Object



50
51
52
53
# File 'lib/http_decoy/minitest.rb', line 50

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

Instance Method Details

#fake_server(name) ⇒ Object

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



108
109
110
# File 'lib/http_decoy/minitest.rb', line 108

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)


114
115
116
117
118
119
120
121
122
123
124
125
126
127
# File 'lib/http_decoy/minitest.rb', line 114

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