{"record":{"id":"55944bd18fc8947f","repo":"bblimke/webmock","slug":"request-stub-stub-to-s-is-not-registered","errorCode":null,"errorMessage":"Request stub \n\n #{stub.to_s} \n\n is not registered.","messagePattern":"Request stub \n\n #(.+?) \n\n is not registered\\.","errorType":"exception","errorClass":"RuntimeError","httpStatus":null,"severity":"warning","filePath":"lib/webmock/stub_registry.rb","lineNumber":57,"sourceCode":"          update_response.call\n        else\n          response_lock.synchronize(&update_response)\n        end\n      }.to_return(lambda { |request|\n        response_lock.synchronize { responses.delete(request.object_id) }\n      })\n\n      global_stubs[order].push stub\n    end\n\n    def register_request_stub(stub)\n      request_stubs.insert(0, stub)\n      stub\n    end\n\n    def remove_request_stub(stub)\n      if not request_stubs.delete(stub)\n        raise \"Request stub \\n\\n #{stub.to_s} \\n\\n is not registered.\"\n      end\n    end\n\n    def registered_request?(request_signature)\n      request_stub_for(request_signature)\n    end\n\n    def response_for_request(request_signature)\n      stub = request_stub_for(request_signature)\n      stub ? evaluate_response_for_request(stub.response, request_signature) : nil\n    end\n\n    private\n\n    def request_stub_for(request_signature)\n      (global_stubs[:before_local_stubs] + request_stubs + global_stubs[:after_local_stubs])\n        .detect { |registered_request_stub|\n          registered_request_stub.request_pattern.matches?(request_signature)","sourceCodeStart":39,"sourceCodeEnd":75,"githubUrl":"https://github.com/bblimke/webmock/blob/b187df8827e1f08a1684a8ddc0a5050dbd449c16/lib/webmock/stub_registry.rb#L39-L75","documentation":"StubRegistry#remove_request_stub (public as WebMock::API.remove_request_stub) deletes a stub from the registry; when Array#delete finds nothing it raises RuntimeError 'Request stub ... is not registered.' It means the exact stub object is not currently in the registry - double removal, removal after a reset, or a stub that was never registered.","triggerScenarios":"Calling WebMock.remove_request_stub(stub) twice for the same stub; removing a stub after WebMock.reset! or test-framework teardown already cleared the registry; removing a WebMock::RequestStub instance built directly with .new (never passed through stub_request); two cleanup hooks (RSpec around + after) both removing the same stub.","commonSituations":"Custom teardown hooks racing webmock's own reset; shared contexts that remove stubs manually and then reset again; stub objects passed between helpers and removed in more than one place; duplicated cleanup code after refactoring.","solutions":["Remove each stub exactly once - choose manual removal OR WebMock.reset!, not both","Guard with registry state: registry = WebMock::StubRegistry.instance; registry.remove_request_stub(stub) if registry.request_stubs.include?(stub)","In generic cleanup helpers, rescue RuntimeError and re-raise only when the message does not match /is not registered/","Only remove stubs created via stub_request, which registers them on creation"],"exampleFix":"// before\nWebMock.remove_request_stub(stub)\nWebMock.remove_request_stub(stub) # second call raises\n\n// after\nregistry = WebMock::StubRegistry.instance\nregistry.remove_request_stub(stub) if registry.request_stubs.include?(stub)","handlingStrategy":"validation","validationCode":"registry = WebMock::StubRegistry.instance\nregistry.remove_request_stub(stub) if registry.request_stubs.include?(stub)","typeGuard":null,"tryCatchPattern":"begin\n  WebMock.remove_request_stub(stub)\nrescue RuntimeError => e\n  raise unless e.message.include?('is not registered')\n  # already removed or the registry was reset - nothing left to do\nend","preventionTips":["Give every stub exactly one removal owner","Prefer WebMock.reset! in global teardown over per-stub removal","Never remove stubs created in another test's scope","Treat this error as a signal that cleanup runs twice, not as noise to rescue away"],"tags":["webmock","ruby","stub-registry","teardown","cleanup"],"backgroundTag":"remove-unregistered-stub","analyzedSha":"b187df8827e1f08a1684a8ddc0a5050dbd449c16","analyzedAt":"2026-08-23T02:55:22.028Z","schemaVersion":2},"datasetVersion":"2026-08-23T08:06:27.607Z"}