gem webmock の README を翻訳しました

# 概要
gem [webmock](https://github.com/bblimke/webmock) の [README](https://github.com/bblimke/webmock/blob/master/README.md) を翻訳しました。

- 翻訳について
    - 翻訳サービス [Deepl](https://www.deepl.com/translator) と [Goole翻訳](https://translate.google.co.jp/) の訳文を参考にしている箇所があります。
    - 翻訳対象の[コミットハッシュ](https://github.com/bblimke/webmock/commit/904aa9806a91fb292a142dc2783ff762eacca0d8)
    - 非公式の翻訳です。
    - 訳文がおかしい箇所があったら指摘をもらえると幸いです。

- ライセンスについて
    - [webmock のライセンス](https://github.com/bblimke/webmock/blob/master/LICENSE)と同様のライセンスに従います。

# 目次
- [WebMock](#webmock)
  - [機能](#%E6%A9%9F%E8%83%BD)
  - [サポートされている HTTP ライブラリ](#%E3%82%B5%E3%83%9D%E3%83%BC%E3%83%88%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%82%8B-http-%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA)
  - [サポートされている Ruby インタープリタ](#%E3%82%B5%E3%83%9D%E3%83%BC%E3%83%88%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%82%8B-ruby-%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%97%E3%83%AA%E3%82%BF)
  - [インストール](#%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)
    - [github の master ブランチから最新の開発バージョンをインストールする方法](#github-%E3%81%AE-master-%E3%83%96%E3%83%A9%E3%83%B3%E3%83%81%E3%81%8B%E3%82%89%E6%9C%80%E6%96%B0%E3%81%AE%E9%96%8B%E7%99%BA%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95)
  - [バージョン v1.x から v2.x へのアップグレード](#%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3-v1x-%E3%81%8B%E3%82%89-v2x-%E3%81%B8%E3%81%AE%E3%82%A2%E3%83%83%E3%83%97%E3%82%B0%E3%83%AC%E3%83%BC%E3%83%89)
    - [Test::Unit](#testunit)
    - [RSpec](#rspec)
    - [MiniTest](#minitest)
    - [Cucumber](#cucumber)
    - [テストフレームワーク外](#%E3%83%86%E3%82%B9%E3%83%88%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AF%E5%A4%96)
  - [例](#%E4%BE%8B)
  - [スタブ](#%E3%82%B9%E3%82%BF%E3%83%96)
    - [URI のみに基づきかつデフォルトレスポンスをともなったスタブリクエスト](#uri-%E3%81%AE%E3%81%BF%E3%81%AB%E5%9F%BA%E3%81%A5%E3%81%8D%E3%81%8B%E3%81%A4%E3%83%87%E3%83%95%E3%82%A9%E3%83%AB%E3%83%88%E3%83%AC%E3%82%B9%E3%83%9D%E3%83%B3%E3%82%B9%E3%82%92%E3%81%A8%E3%82%82%E3%81%AA%E3%81%A3%E3%81%9F%E3%82%B9%E3%82%BF%E3%83%96%E3%83%AA%E3%82%AF%E3%82%A8%E3%82%B9%E3%83%88)
    - [メソッド、URI、ボディ、ヘッダに基づいたスタブリクエスト](#%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89uri%E3%83%9C%E3%83%87%E3%82%A3%E3%83%98%E3%83%83%E3%83%80%E3%81%AB%E5%9F%BA%E3%81%A5%E3%81%84%E3%81%9F%E3%82%B9%E3%82%BF%E3%83%96%E3%83%AA%E3%82%AF%E3%82%A8%E3%82%B9%E3%83%88)
    - [正規表現を使用したリクエストボディとヘッダのマッチ](#%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%9F%E3%83%AA%E3%82%AF%E3%82%A8%E3%82%B9%E3%83%88%E3%83%9C%E3%83%87%E3%82%A3%E3%81%A8%E3%83%98%E3%83%83%E3%83%80%E3%81%AE%E3%83%9E%E3%83%83%E3%83%81)
    - [ハッシュを使用したリクエストボディのマッチ。リクエストボディは URL エンコード、JSON、XML で記述しリクエスト可能です。](#%E3%83%8F%E3%83%83%E3%82%B7%E3%83%A5%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%9F%E3%83%AA%E3%82%AF%E3%82%A8%E3%82%B9%E3%83%88%E3%83%9C%E3%83%87%E3%82%A3%E3%81%AE%E3%83%9E%E3%83%83%E3%83%81%E3%83%AA%E3%82%AF%E3%82%A8%E3%82%B9%E3%83%88%E3%83%9C%E3%83%87%E3%82%A3%E3%81%AF-url-%E3%82%A8%E3%83%B3%E3%82%B3%E3%83%BC%E3%83%89jsonxml-%E3%81%A7%E8%A8%98%E8%BF%B0%E3%81%97%E3%83%AA%E3%82%AF%E3%82%A8%E3%82%B9%E3%83%88%E5%8F%AF%E8%83%BD%E3%81%A7%E3%81%99)
    - [部分ハッシュを使用したリクエストのマッチ](#%E9%83%A8%E5%88%86%E3%83%8F%E3%83%83%E3%82%B7%E3%83%A5%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%9F%E3%83%AA%E3%82%AF%E3%82%A8%E3%82%B9%E3%83%88%E3%81%AE%E3%83%9E%E3%83%83%E3%83%81)
    - [カスタムリクエストヘッダのマッチ](#%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0%E3%83%AA%E3%82%AF%E3%82%A8%E3%82%B9%E3%83%88%E3%83%98%E3%83%83%E3%83%80%E3%81%AE%E3%83%9E%E3%83%83%E3%83%81)
    - [同じ名前の複数のヘッダのマッチ](#%E5%90%8C%E3%81%98%E5%90%8D%E5%89%8D%E3%81%AE%E8%A4%87%E6%95%B0%E3%81%AE%E3%83%98%E3%83%83%E3%83%80%E3%81%AE%E3%83%9E%E3%83%83%E3%83%81)
    - [与えられたブロックを使用したリクエストのマッチ](#%E4%B8%8E%E3%81%88%E3%82%89%E3%82%8C%E3%81%9F%E3%83%96%E3%83%AD%E3%83%83%E3%82%AF%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%9F%E3%83%AA%E3%82%AF%E3%82%A8%E3%82%B9%E3%83%88%E3%81%AE%E3%83%9E%E3%83%83%E3%83%81)
    - [BASIC 認証をともなったリクエスト](#basic-%E8%AA%8D%E8%A8%BC%E3%82%92%E3%81%A8%E3%82%82%E3%81%AA%E3%81%A3%E3%81%9F%E3%83%AA%E3%82%AF%E3%82%A8%E3%82%B9%E3%83%88)
        - [重要事項。バージョン 2.0.0 から、WebMock は Authorization ヘッダ内で与えられるクレデンシャルと URL のユーザー情報の中で与えられるクレデンシャルをマッチさせません。つまり、`stub_request(:get, "user:pass@www.example.com")` は Authorization ヘッダで与えられたクレデンシャルをともなったリクエストとマッチしません。](#%E9%87%8D%E8%A6%81%E4%BA%8B%E9%A0%85%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3-200-%E3%81%8B%E3%82%89webmock-%E3%81%AF-authorization-%E3%83%98%E3%83%83%E3%83%80%E5%86%85%E3%81%A7%E4%B8%8E%E3%81%88%E3%82%89%E3%82%8C%E3%82%8B%E3%82%AF%E3%83%AC%E3%83%87%E3%83%B3%E3%82%B7%E3%83%A3%E3%83%AB%E3%81%A8-url-%E3%81%AE%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E6%83%85%E5%A0%B1%E3%81%AE%E4%B8%AD%E3%81%A7%E4%B8%8E%E3%81%88%E3%82%89%E3%82%8C%E3%82%8B%E3%82%AF%E3%83%AC%E3%83%87%E3%83%B3%E3%82%B7%E3%83%A3%E3%83%AB%E3%82%92%E3%83%9E%E3%83%83%E3%83%81%E3%81%95%E3%81%9B%E3%81%BE%E3%81%9B%E3%82%93%E3%81%A4%E3%81%BE%E3%82%8Astub_requestget-userpasswwwexamplecom-%E3%81%AF-authorization-%E3%83%98%E3%83%83%E3%83%80%E3%81%A7%E4%B8%8E%E3%81%88%E3%82%89%E3%82%8C%E3%81%9F%E3%82%AF%E3%83%AC%E3%83%87%E3%83%B3%E3%82%B7%E3%83%A3%E3%83%AB%E3%82%92%E3%81%A8%E3%82%82%E3%81%AA%E3%81%A3%E3%81%9F%E3%83%AA%E3%82%AF%E3%82%A8%E3%82%B9%E3%83%88%E3%81%A8%E3%83%9E%E3%83%83%E3%83%81%E3%81%97%E3%81%BE%E3%81%9B%E3%82%93)
    - [URL 内の BASIC 認証をともなったリクエスト](#url-%E5%86%85%E3%81%AE-basic-%E8%AA%8D%E8%A8%BC%E3%82%92%E3%81%A8%E3%82%82%E3%81%AA%E3%81%A3%E3%81%9F%E3%83%AA%E3%82%AF%E3%82%A8%E3%82%B9%E3%83%88)
    - [正規表現を使用した URI のマッチ](#%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%9F-uri-%E3%81%AE%E3%83%9E%E3%83%83%E3%83%81)
    - [RFC 6570 を使用した URI のマッチ。基本的な例](#rfc-6570-%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%9F-uri-%E3%81%AE%E3%83%9E%E3%83%83%E3%83%81%E5%9F%BA%E6%9C%AC%E7%9A%84%E3%81%AA%E4%BE%8B)
    - [RFC 6570 を使用した URI のマッチ。応用的な例](#rfc-6570-%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%9F-uri-%E3%81%AE%E3%83%9E%E3%83%83%E3%83%81%E5%BF%9C%E7%94%A8%E7%9A%84%E3%81%AA%E4%BE%8B)
    - [ハッシュを使用したクエリパラムのマッチ](#%E3%83%8F%E3%83%83%E3%82%B7%E3%83%A5%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%9F%E3%82%AF%E3%82%A8%E3%83%AA%E3%83%91%E3%83%A9%E3%83%A0%E3%81%AE%E3%83%9E%E3%83%83%E3%83%81)
    - [ハッシュを使用した部分的なクエリパラムのマッチ](#%E3%83%8F%E3%83%83%E3%82%B7%E3%83%A5%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%9F%E9%83%A8%E5%88%86%E7%9A%84%E3%81%AA%E3%82%AF%E3%82%A8%E3%83%AA%E3%83%91%E3%83%A9%E3%83%A0%E3%81%AE%E3%83%9E%E3%83%83%E3%83%81)
    - [hash_excluding メソッドを使用した部分的なクエリパラムのマッチ](#hash_excluding-%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%9F%E9%83%A8%E5%88%86%E7%9A%84%E3%81%AA%E3%82%AF%E3%82%A8%E3%83%AA%E3%83%91%E3%83%A9%E3%83%A0%E3%81%AE%E3%83%9E%E3%83%83%E3%83%81)
    - [カスタムレスポンスをともなったスタブ](#%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0%E3%83%AC%E3%82%B9%E3%83%9D%E3%83%B3%E3%82%B9%E3%82%92%E3%81%A8%E3%82%82%E3%81%AA%E3%81%A3%E3%81%9F%E3%82%B9%E3%82%BF%E3%83%96)
    - [IO オブジェクトとして指定されたボディをともなったレスポンス](#io-%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%A8%E3%81%97%E3%81%A6%E6%8C%87%E5%AE%9A%E3%81%95%E3%82%8C%E3%81%9F%E3%83%9C%E3%83%87%E3%82%A3%E3%82%92%E3%81%A8%E3%82%82%E3%81%AA%E3%81%A3%E3%81%9F%E3%83%AC%E3%82%B9%E3%83%9D%E3%83%B3%E3%82%B9)
    - [カスタムステータスメッセージをともなったレスポンス](#%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0%E3%82%B9%E3%83%86%E3%83%BC%E3%82%BF%E3%82%B9%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%82%92%E3%81%A8%E3%82%82%E3%81%AA%E3%81%A3%E3%81%9F%E3%83%AC%E3%82%B9%E3%83%9D%E3%83%B3%E3%82%B9)
    - [`curl -is` コマンドで記録された未加工のレスポンスを再現する](#curl--is-%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%A7%E8%A8%98%E9%8C%B2%E3%81%95%E3%82%8C%E3%81%9F%E6%9C%AA%E5%8A%A0%E5%B7%A5%E3%81%AE%E3%83%AC%E3%82%B9%E3%83%9D%E3%83%B3%E3%82%B9%E3%82%92%E5%86%8D%E7%8F%BE%E3%81%99%E3%82%8B)
    - [ブロックから評価される動的なレスポンス](#%E3%83%96%E3%83%AD%E3%83%83%E3%82%AF%E3%81%8B%E3%82%89%E8%A9%95%E4%BE%A1%E3%81%95%E3%82%8C%E3%82%8B%E5%8B%95%E7%9A%84%E3%81%AA%E3%83%AC%E3%82%B9%E3%83%9D%E3%83%B3%E3%82%B9)
    - [ラムダから評価される動的なレスポンス](#%E3%83%A9%E3%83%A0%E3%83%80%E3%81%8B%E3%82%89%E8%A9%95%E4%BE%A1%E3%81%95%E3%82%8C%E3%82%8B%E5%8B%95%E7%9A%84%E3%81%AA%E3%83%AC%E3%82%B9%E3%83%9D%E3%83%B3%E3%82%B9)
    - [`curl -is` で記録された動的に評価された未加工のレスポンス](#curl--is-%E3%81%A7%E8%A8%98%E9%8C%B2%E3%81%95%E3%82%8C%E3%81%9F%E5%8B%95%E7%9A%84%E3%81%AB%E8%A9%95%E4%BE%A1%E3%81%95%E3%82%8C%E3%81%9F%E6%9C%AA%E5%8A%A0%E5%B7%A5%E3%81%AE%E3%83%AC%E3%82%B9%E3%83%9D%E3%83%B3%E3%82%B9)
    - [一部分が動的評価されているレスポンス](#%E4%B8%80%E9%83%A8%E5%88%86%E3%81%8C%E5%8B%95%E7%9A%84%E8%A9%95%E4%BE%A1%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%82%8B%E3%83%AC%E3%82%B9%E3%83%9D%E3%83%B3%E3%82%B9)
    - [Rack レスポンス](#rack-%E3%83%AC%E3%82%B9%E3%83%9D%E3%83%B3%E3%82%B9)
    - [エラーを発生させる](#%E3%82%A8%E3%83%A9%E3%83%BC%E3%82%92%E7%99%BA%E7%94%9F%E3%81%95%E3%81%9B%E3%82%8B)
      - [クラスで宣言された例外](#%E3%82%AF%E3%83%A9%E3%82%B9%E3%81%A7%E5%AE%A3%E8%A8%80%E3%81%95%E3%82%8C%E3%81%9F%E4%BE%8B%E5%A4%96)
      - [インスタンスによる例外](#%E3%82%A4%E3%83%B3%E3%82%B9%E3%82%BF%E3%83%B3%E3%82%B9%E3%81%AB%E3%82%88%E3%82%8B%E4%BE%8B%E5%A4%96)
      - [文字列による例外](#%E6%96%87%E5%AD%97%E5%88%97%E3%81%AB%E3%82%88%E3%82%8B%E4%BE%8B%E5%A4%96)
    - [タイムアウトエラーを発生させる](#%E3%82%BF%E3%82%A4%E3%83%A0%E3%82%A2%E3%82%A6%E3%83%88%E3%82%A8%E3%83%A9%E3%83%BC%E3%82%92%E7%99%BA%E7%94%9F%E3%81%95%E3%81%9B%E3%82%8B)
    - [リクエストの繰り返しにおける複数のレスポンス](#%E3%83%AA%E3%82%AF%E3%82%A8%E3%82%B9%E3%83%88%E3%81%AE%E7%B9%B0%E3%82%8A%E8%BF%94%E3%81%97%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E8%A4%87%E6%95%B0%E3%81%AE%E3%83%AC%E3%82%B9%E3%83%9D%E3%83%B3%E3%82%B9)
    - [`to_return()`、`to_raise()`、`to_timeout` メソッドを連鎖させた複数のレスポンス](#to_returnto_raiseto_timeout-%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89%E3%82%92%E9%80%A3%E9%8E%96%E3%81%95%E3%81%9B%E3%81%9F%E8%A4%87%E6%95%B0%E3%81%AE%E3%83%AC%E3%82%B9%E3%83%9D%E3%83%B3%E3%82%B9)
    - [与えられたレスポンスが返却される回数の指定](#%E4%B8%8E%E3%81%88%E3%82%89%E3%82%8C%E3%81%9F%E3%83%AC%E3%82%B9%E3%83%9D%E3%83%B3%E3%82%B9%E3%81%8C%E8%BF%94%E5%8D%B4%E3%81%95%E3%82%8C%E3%82%8B%E5%9B%9E%E6%95%B0%E3%81%AE%E6%8C%87%E5%AE%9A)
    - [未使用のスタブの解除](#%E6%9C%AA%E4%BD%BF%E7%94%A8%E3%81%AE%E3%82%B9%E3%82%BF%E3%83%96%E3%81%AE%E8%A7%A3%E9%99%A4)
    - [ネットワークへの本物のリクエストの許可、不許可](#%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E3%81%B8%E3%81%AE%E6%9C%AC%E7%89%A9%E3%81%AE%E3%83%AA%E3%82%AF%E3%82%A8%E3%82%B9%E3%83%88%E3%81%AE%E8%A8%B1%E5%8F%AF%E4%B8%8D%E8%A8%B1%E5%8F%AF)
    - [ローカルホストへのリクエストは許可しつつ外部へのリクエストは無効にする](#%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E3%83%9B%E3%82%B9%E3%83%88%E3%81%B8%E3%81%AE%E3%83%AA%E3%82%AF%E3%82%A8%E3%82%B9%E3%83%88%E3%81%AF%E8%A8%B1%E5%8F%AF%E3%81%97%E3%81%A4%E3%81%A4%E5%A4%96%E9%83%A8%E3%81%B8%E3%81%AE%E3%83%AA%E3%82%AF%E3%82%A8%E3%82%B9%E3%83%88%E3%81%AF%E7%84%A1%E5%8A%B9%E3%81%AB%E3%81%99%E3%82%8B)
    - [特定のリクエストは許可しつつ外部へのリクエストは無効にする](#%E7%89%B9%E5%AE%9A%E3%81%AE%E3%83%AA%E3%82%AF%E3%82%A8%E3%82%B9%E3%83%88%E3%81%AF%E8%A8%B1%E5%8F%AF%E3%81%97%E3%81%A4%E3%81%A4%E5%A4%96%E9%83%A8%E3%81%B8%E3%81%AE%E3%83%AA%E3%82%AF%E3%82%A8%E3%82%B9%E3%83%88%E3%81%AF%E7%84%A1%E5%8A%B9%E3%81%AB%E3%81%99%E3%82%8B)
  - [Net::HTTP.start 上のコネクト](#nethttpstart-%E4%B8%8A%E3%81%AE%E3%82%B3%E3%83%8D%E3%82%AF%E3%83%88)
  - [期待値の設定](#%E6%9C%9F%E5%BE%85%E5%80%A4%E3%81%AE%E8%A8%AD%E5%AE%9A)
    - [Test::Unit の期待値の設定](#testunit-%E3%81%AE%E6%9C%9F%E5%BE%85%E5%80%A4%E3%81%AE%E8%A8%AD%E5%AE%9A)
    - [スタブではない本当のリクエストの期待](#%E3%82%B9%E3%82%BF%E3%83%96%E3%81%A7%E3%81%AF%E3%81%AA%E3%81%84%E6%9C%AC%E5%BD%93%E3%81%AE%E3%83%AA%E3%82%AF%E3%82%A8%E3%82%B9%E3%83%88%E3%81%AE%E6%9C%9F%E5%BE%85)
    - [スタブ上の Test::Unit の期待値の設定](#%E3%82%B9%E3%82%BF%E3%83%96%E4%B8%8A%E3%81%AE-testunit-%E3%81%AE%E6%9C%9F%E5%BE%85%E5%80%A4%E3%81%AE%E8%A8%AD%E5%AE%9A)
    - [`WebMock` モジュール上の RSpec の期待値の設定](#webmock-%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%E4%B8%8A%E3%81%AE-rspec-%E3%81%AE%E6%9C%9F%E5%BE%85%E5%80%A4%E3%81%AE%E8%A8%AD%E5%AE%9A)
    - [`a_request` を使用した RSpec の期待値の設定](#a_request-%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%9F-rspec-%E3%81%AE%E6%9C%9F%E5%BE%85%E5%80%A4%E3%81%AE%E8%A8%AD%E5%AE%9A)
    - [スタブ上の RSpec の期待値の設定](#%E3%82%B9%E3%82%BF%E3%83%96%E4%B8%8A%E3%81%AE-rspec-%E3%81%AE%E6%9C%9F%E5%BE%85%E5%80%A4%E3%81%AE%E8%A8%AD%E5%AE%9A)
  - [スタブとリクエスト履歴のリセット](#%E3%82%B9%E3%82%BF%E3%83%96%E3%81%A8%E3%83%AA%E3%82%AF%E3%82%A8%E3%82%B9%E3%83%88%E5%B1%A5%E6%AD%B4%E3%81%AE%E3%83%AA%E3%82%BB%E3%83%83%E3%83%88)
  - [リクエストカウンタのリセット](#%E3%83%AA%E3%82%AF%E3%82%A8%E3%82%B9%E3%83%88%E3%82%AB%E3%82%A6%E3%83%B3%E3%82%BF%E3%81%AE%E3%83%AA%E3%82%BB%E3%83%83%E3%83%88)
  - [WebMock または HTTP クライアントアダプタのみの無効化と有効化](#webmock-%E3%81%BE%E3%81%9F%E3%81%AF-http-%E3%82%AF%E3%83%A9%E3%82%A4%E3%82%A2%E3%83%B3%E3%83%88%E3%82%A2%E3%83%80%E3%83%97%E3%82%BF%E3%81%AE%E3%81%BF%E3%81%AE%E7%84%A1%E5%8A%B9%E5%8C%96%E3%81%A8%E6%9C%89%E5%8A%B9%E5%8C%96)
  - [リクエストのマッチ](#%E3%83%AA%E3%82%AF%E3%82%A8%E3%82%B9%E3%83%88%E3%81%AE%E3%83%9E%E3%83%83%E3%83%81)
  - [スタブの優先順位](#%E3%82%B9%E3%82%BF%E3%83%96%E3%81%AE%E5%84%AA%E5%85%88%E9%A0%86%E4%BD%8D)
  - [URI のマッチ](#uri-%E3%81%AE%E3%83%9E%E3%83%83%E3%83%81)
  - [URI Templates のマッチング](#uri-templates-%E3%81%AE%E3%83%9E%E3%83%83%E3%83%81%E3%83%B3%E3%82%B0)
  - [ヘッダのマッチング](#%E3%83%98%E3%83%83%E3%83%80%E3%81%AE%E3%83%9E%E3%83%83%E3%83%81%E3%83%B3%E3%82%B0)
  - [本物のリクエストとレスポンスの記録とそのリプレイ](#%E6%9C%AC%E7%89%A9%E3%81%AE%E3%83%AA%E3%82%AF%E3%82%A8%E3%82%B9%E3%83%88%E3%81%A8%E3%83%AC%E3%82%B9%E3%83%9D%E3%83%B3%E3%82%B9%E3%81%AE%E8%A8%98%E9%8C%B2%E3%81%A8%E3%81%9D%E3%81%AE%E3%83%AA%E3%83%97%E3%83%AC%E3%82%A4)
  - [リクエストのコールバック](#%E3%83%AA%E3%82%AF%E3%82%A8%E3%82%B9%E3%83%88%E3%81%AE%E3%82%B3%E3%83%BC%E3%83%AB%E3%83%90%E3%83%83%E3%82%AF)
      - [WebMock はスタブされたあるいは本物のリクエストのコールバックを引き起こすことができる](#webmock-%E3%81%AF%E3%82%B9%E3%82%BF%E3%83%96%E3%81%95%E3%82%8C%E3%81%9F%E3%81%82%E3%82%8B%E3%81%84%E3%81%AF%E6%9C%AC%E7%89%A9%E3%81%AE%E3%83%AA%E3%82%AF%E3%82%A8%E3%82%B9%E3%83%88%E3%81%AE%E3%82%B3%E3%83%BC%E3%83%AB%E3%83%90%E3%83%83%E3%82%AF%E3%82%92%E5%BC%95%E3%81%8D%E8%B5%B7%E3%81%93%E3%81%99%E3%81%93%E3%81%A8%E3%81%8C%E3%81%A7%E3%81%8D%E3%82%8B)
      - [Patron で作成されたリクエストは除き、本物のリクエストのみコールバックを引き起こす](#patron-%E3%81%A7%E4%BD%9C%E6%88%90%E3%81%95%E3%82%8C%E3%81%9F%E3%83%AA%E3%82%AF%E3%82%A8%E3%82%B9%E3%83%88%E3%81%AF%E9%99%A4%E3%81%8D%E6%9C%AC%E7%89%A9%E3%81%AE%E3%83%AA%E3%82%AF%E3%82%A8%E3%82%B9%E3%83%88%E3%81%AE%E3%81%BF%E3%82%B3%E3%83%BC%E3%83%AB%E3%83%90%E3%83%83%E3%82%AF%E3%82%92%E5%BC%95%E3%81%8D%E8%B5%B7%E3%81%93%E3%81%99)
  - [Bugs and Issues](#bugs-and-issues)
  - [Issue triage *](#issue-triage-)
  - [Suggestions](#suggestions)
  - [Development](#development)
  - [Credits](#credits)
  - [Background](#background)
  - [Copyright](#copyright)

# WebMock

Ruby の HTTP リクエストにおいて期待値のスタブと設定をするライブラリです。

## 機能

* 低 HTTP クライアントライブラリレベル（HTTP ライブラリを変更してもテストを変更する必要はありません）におけるHTTP リクエストのスタブ。
* HTTP リクエスト上の期待値の設定と確認。
* HTTP メソッド、HTTP URI、HTTP ヘッダ、HTTP ボディをもとにしたリクエストとの一致。
* 異なる表現における同じ URI の優れた一致（エンコード済みの URI と未エンコードの URI も一致させる）
* 異なる表現における同じヘッダの優れた一致。
* Test::Unit のサポート
* RSpec のサポート
* MiniTest のサポート

## サポートされている HTTP ライブラリ

* Net::HTTP and libraries based on Net::HTTP (i.e RightHttpConnection, REST Client, HTTParty)
* HTTPClient
* Patron
* EM-HTTP-Request
* Curb (currently only Curb::Easy)
* Typhoeus (currently only Typhoeus::Hydra)
* Excon
* HTTP Gem
* Manticore
* Async::HTTP::Client

## サポートされている Ruby インタープリタ

* MRI 2.2
* MRI 2.3
* MRI 2.4
* MRI 2.5
* MRI 2.6
* MRI 2.7
* JRuby
* Rubinius

## インストール

    gem install webmock

### github の master ブランチから最新の開発バージョンをインストールする方法

    git clone http://github.com/bblimke/webmock.git
    cd webmock
    rake install

## バージョン v1.x から v2.x へのアップグレード

バージョン 1.x からバージョン 2.x の変更点は [CHANGELOG.md](CHANGELOG.md) に記載されています。

### Test::Unit
`test/test_helper.rb` に下記のコードを追加してください。

```ruby
require 'webmock/test_unit'
```

### RSpec
`spec/spec_helper`　に下記のコードを追加してください。


```ruby
require 'webmock/rspec'
```

### MiniTest
`test/test_helper` に下記のコードを追加してください。

```ruby
require 'webmock/minitest'
```

### Cucumber
下記を記載した `features/support/webmock.rb` を作成してください。

```ruby
require 'webmock/cucumber'
```

### テストフレームワーク外
テストフレームワーク外でも WebMock を使用することができます。

```ruby
require 'webmock'
include WebMock::API

WebMock.enable!
```

## 例
## スタブ
### URI のみに基づきかつデフォルトレスポンスをともなったスタブリクエスト

```ruby
stub_request(:any, "www.example.com")

Net::HTTP.get("www.example.com", "/")    # ===> Success
```

### メソッド、URI、ボディ、ヘッダに基づいたスタブリクエスト

```ruby
stub_request(:post, "www.example.com").
  with(body: "abc", headers: { 'Content-Length' => 3 })

uri = URI.parse("http://www.example.com/")
req = Net::HTTP::Post.new(uri.path)
req['Content-Length'] = 3

res = Net::HTTP.start(uri.host, uri.port) do |http|
  http.request(req, "abc")
end    # ===> Success
```

### 正規表現を使用したリクエストボディとヘッダのマッチ

```ruby
stub_request(:post, "www.example.com").
  with(body: /world$/, headers: {"Content-Type" => /image\/.+/}).
  to_return(body: "abc")

uri = URI.parse('http://www.example.com/')
req = Net::HTTP::Post.new(uri.path)
req['Content-Type'] = 'image/png'

res = Net::HTTP.start(uri.host, uri.port) do |http|
  http.request(req, 'hello world')
end    # ===> Success
```

### ハッシュを使用したリクエストボディのマッチ。リクエストボディは URL エンコード、JSON、XML で記述しリクエスト可能です。

```ruby
stub_request(:post, "www.example.com").
  with(body: {data: {a: '1', b: 'five'}})

RestClient.post('www.example.com', "data[a]=1&data[b]=five",
  content_type: 'application/x-www-form-urlencoded')    # ===> Success

RestClient.post('www.example.com', '{"data":{"a":"1","b":"five"}}',
  content_type: 'application/json')    # ===> Success

RestClient.post('www.example.com', '<data a="1" b="five" />',
  content_type: 'application/xml')    # ===> Success
```

### 部分ハッシュを使用したリクエストのマッチ

```ruby
stub_request(:post, "www.example.com").
  with(body: hash_including({data: {a: '1', b: 'five'}}))

RestClient.post('www.example.com', "data[a]=1&data[b]=five&x=1",
:content_type => 'application/x-www-form-urlencoded')    # ===> Success
```

### カスタムリクエストヘッダのマッチ

```ruby
stub_request(:any, "www.example.com").
  with(headers:{ 'Header-Name' => 'Header-Value' })

uri = URI.parse('http://www.example.com/')
req = Net::HTTP::Post.new(uri.path)
req['Header-Name'] = 'Header-Value'

res = Net::HTTP.start(uri.host, uri.port) do |http|
  http.request(req, 'abc')
end    # ===> Success
```

### 同じ名前の複数のヘッダのマッチ

```ruby
stub_request(:get, 'www.example.com').
  with(headers: {'Accept' => ['image/jpeg', 'image/png'] })

req = Net::HTTP::Get.new("/")
req['Accept'] = ['image/png']
req.add_field('Accept', 'image/jpeg')
Net::HTTP.start("www.example.com") {|http| http.request(req) }    # ===> Success
```

### 与えられたブロックを使用したリクエストのマッチ

```ruby
stub_request(:post, "www.example.com").with { |request| request.body == "abc" }
RestClient.post('www.example.com', 'abc')    # ===> Success
```

### BASIC 認証をともなったリクエスト

```ruby
stub_request(:get, "www.example.com").with(basic_auth: ['user', 'pass'])
# or
# stub_request(:get, "www.example.com").
#   with(headers: {'Authorization' => "Basic #{ Base64.strict_encode64('user:pass').chomp}"})

Net::HTTP.start('www.example.com') do |http|
  req = Net::HTTP::Get.new('/')
  req.basic_auth 'user', 'pass'
  http.request(req)
end    # ===> Success
```

##### 重要事項。バージョン 2.0.0 から、WebMock は Authorization ヘッダ内で与えられるクレデンシャルと URL のユーザー情報の中で与えられるクレデンシャルをマッチさせません。つまり、`stub_request(:get, "user:pass@www.example.com")` は Authorization ヘッダで与えられたクレデンシャルをともなったリクエストとマッチしません。

### URL 内の BASIC 認証をともなったリクエスト

```ruby
stub_request(:get, "user:pass@www.example.com")

RestClient.get('user:pass@www.example.com')    # ===> Success
```

### 正規表現を使用した URI のマッチ

```ruby
stub_request(:any, /example/)

Net::HTTP.get('www.example.com', '/')    # ===> Success
```

### RFC 6570 を使用した URI のマッチ。基本的な例

```ruby
uri_template = Addressable::Template.new "www.example.com/{id}/"
stub_request(:any, uri_template)

Net::HTTP.get('www.example.com', '/webmock/')    # ===> Success
```

### RFC 6570 を使用した URI のマッチ。応用的な例

```ruby
uri_template =
  Addressable::Template.new "www.example.com/thing/{id}.json{?x,y,z}{&other*}"
stub_request(:any, uri_template)

Net::HTTP.get('www.example.com',
  '/thing/5.json?x=1&y=2&z=3&anyParam=4')    # ===> Success
```

### ハッシュを使用したクエリパラムのマッチ

```ruby
stub_request(:get, "www.example.com").with(query: {"a" => ["b", "c"]})

RestClient.get("http://www.example.com/?a[]=b&a[]=c")    # ===> Success
```

### ハッシュを使用した部分的なクエリパラムのマッチ

```ruby
stub_request(:get, "www.example.com").
  with(query: hash_including({"a" => ["b", "c"]}))

RestClient.get("http://www.example.com/?a[]=b&a[]=c&x=1")    # ===> Success
```

### hash_excluding メソッドを使用した部分的なクエリパラムのマッチ

```ruby
stub_request(:get, "www.example.com").
  with(query: hash_excluding({"a" => "b"}))

RestClient.get("http://www.example.com/?a=b")    # ===> Failure
RestClient.get("http://www.example.com/?a=c")    # ===> Success
```

### カスタムレスポンスをともなったスタブ

```ruby
stub_request(:any, "www.example.com").
  to_return(body: "abc", status: 200,
    headers: { 'Content-Length' => 3 })

Net::HTTP.get("www.example.com", '/')    # ===> "abc"
```

### IO オブジェクトとして指定されたボディをともなったレスポンス

```ruby
File.open('/tmp/response_body.txt', 'w') { |f| f.puts 'abc' }

stub_request(:any, "www.example.com").
  to_return(body: File.new('/tmp/response_body.txt'), status: 200)

Net::HTTP.get('www.example.com', '/')    # ===> "abc\n"
```

### カスタムステータスメッセージをともなったレスポンス

```ruby
stub_request(:any, "www.example.com").
  to_return(status: [500, "Internal Server Error"])

req = Net::HTTP::Get.new("/")
Net::HTTP.start("www.example.com") { |http| http.request(req) }.
  message    # ===> "Internal Server Error"
```

### `curl -is` コマンドで記録された未加工のレスポンスを再現する

```
curl -is www.example.com > /tmp/example_curl_-is_output.txt
```

```ruby
raw_response_file = File.new("/tmp/example_curl_-is_output.txt")
```

上記で生成されたファイルを使用する。

```ruby
stub_request(:get, "www.example.com").to_return(raw_response_file)
```

string を引数にすることもできる。

```ruby
stub_request(:get, "www.example.com").to_return(raw_response_file.read)
```

### ブロックから評価される動的なレスポンス

```ruby
stub_request(:any, 'www.example.net').
  to_return { |request| {body: request.body} }

RestClient.post('www.example.net', 'abc')    # ===> "abc\n"
```

### ラムダから評価される動的なレスポンス

```ruby
stub_request(:any, 'www.example.net').
  to_return(lambda { |request| {body: request.body} })

RestClient.post('www.example.net', 'abc')    # ===> "abc\n"
```

### `curl -is` で記録された動的に評価された未加工のレスポンス

    `curl -is www.example.com > /tmp/www.example.com.txt`
```ruby
stub_request(:get, "www.example.com").
  to_return(lambda { |request| File.new("/tmp/#{request.uri.host.to_s}.txt") })
```

### 一部分が動的評価されているレスポンス

```ruby
stub_request(:any, 'www.example.net').
  to_return(body: lambda { |request| request.body })

RestClient.post('www.example.net', 'abc')    # ===> "abc\n"
```

### Rack レスポンス

```ruby
class MyRackApp
  def self.call(env)
    [200, {}, ["Hello"]]
  end
end

stub_request(:get, "www.example.com").to_rack(MyRackApp)

RestClient.post('www.example.com')    # ===> "Hello"
```

### エラーを発生させる

#### クラスで宣言された例外

```ruby
stub_request(:any, 'www.example.net').to_raise(StandardError)

RestClient.post('www.example.net', 'abc')    # ===> StandardError
```

#### インスタンスによる例外

```ruby
stub_request(:any, 'www.example.net').to_raise(StandardError.new("some error"))
```

#### 文字列による例外

```ruby
stub_request(:any, 'www.example.net').to_raise("some error")
```

### タイムアウトエラーを発生させる

```ruby
stub_request(:any, 'www.example.net').to_timeout

RestClient.post('www.example.net', 'abc')    # ===> RestClient::RequestTimeout
```

### リクエストの繰り返しにおける複数のレスポンス

```ruby
stub_request(:get, "www.example.com").
  to_return({body: "abc"}, {body: "def"})
Net::HTTP.get('www.example.com', '/')    # ===> "abc\n"
Net::HTTP.get('www.example.com', '/')    # ===> "def\n"

# すべてのレスポンスが使用されたあとは最後のレスポンスがずっと返却される。

Net::HTTP.get('www.example.com', '/')    # ===> "def\n"
```

### `to_return()`、`to_raise()`、`to_timeout` メソッドを連鎖させた複数のレスポンス

```ruby
stub_request(:get, "www.example.com").
  to_return({body: "abc"}).then.  #then() メソッドはシンタックスシュガーです。
  to_return({body: "def"}).then.
  to_raise(MyException)

Net::HTTP.get('www.example.com', '/')    # ===> "abc\n"
Net::HTTP.get('www.example.com', '/')    # ===> "def\n"
Net::HTTP.get('www.example.com', '/')    # ===> MyException raised
```

### 与えられたレスポンスが返却される回数の指定

```ruby
stub_request(:get, "www.example.com").
  to_return({body: "abc"}).times(2).then.
  to_return({body: "def"})

Net::HTTP.get('www.example.com', '/')    # ===> "abc\n"
Net::HTTP.get('www.example.com', '/')    # ===> "abc\n"
Net::HTTP.get('www.example.com', '/')    # ===> "def\n"
```

### 未使用のスタブの解除

```ruby
stub_get = stub_request(:get, "www.example.com")
remove_request_stub(stub_get)
```

### ネットワークへの本物のリクエストの許可、不許可

```ruby
WebMock.allow_net_connect!

stub_request(:any, "www.example.com").to_return(body: "abc")

Net::HTTP.get('www.example.com', '/')    # ===> "abc"

Net::HTTP.get('www.something.com', '/')    # ===> /.+Something.+/

WebMock.disable_net_connect!

Net::HTTP.get('www.something.com', '/')    # ===> Failure
```

### ローカルホストへのリクエストは許可しつつ外部へのリクエストは無効にする

```ruby
WebMock.disable_net_connect!(allow_localhost: true)

Net::HTTP.get('www.something.com', '/')    # ===> Failure

Net::HTTP.get('localhost:9887', '/')    # ===> Allowed. Perhaps to Selenium?
```

### 特定のリクエストは許可しつつ外部へのリクエストは無効にする

許可するリクエストはいくつかの方法で指定することができます。

文字列でホスト名を指定する方法。

```ruby
WebMock.disable_net_connect!(allow: 'www.example.org')

RestClient.get('www.something.com', '/')    # ===> Failure
RestClient.get('www.example.org', '/')      # ===> Allowed
RestClient.get('www.example.org:8080', '/') # ===> Allowed
```

文字列でホスト名とポートを指定する方法。

```ruby
WebMock.disable_net_connect!(allow: 'www.example.org:8080')

RestClient.get('www.something.com', '/')    # ===> Failure
RestClient.get('www.example.org', '/')      # ===> Failure
RestClient.get('www.example.org:8080', '/') # ===> Allowed
```

URI をマッチする正規表現で指定する方法。

```ruby
WebMock.disable_net_connect!(allow: %r{ample.org/foo})

RestClient.get('www.example.org', '/foo/bar') # ===> Allowed
RestClient.get('sample.org', '/foo')          # ===> Allowed
RestClient.get('sample.org', '/bar')          # ===> Failure
```

`#call` メソッドに応答し、`URI` オブジェクトを受け取りブーリアンを返すオブジェクトを指定する方法。

```ruby
blacklist = ['google.com', 'facebook.com', 'apple.com']
allowed_sites = lambda{|uri|
  blacklist.none?{|site| uri.host.include?(site) }
}
WebMock.disable_net_connect!(allow: allowed_sites)

RestClient.get('www.example.org', '/')  # ===> Allowed
RestClient.get('www.facebook.com', '/') # ===> Failure
RestClient.get('apple.com', '/')        # ===> Failure
```

上記のいづれかのオブジェクトが入っている配列。

```ruby
WebMock.disable_net_connect!(allow: [
  lambda{|uri| uri.host.length % 2 == 0 },
  /ample.org/,
  'bbc.co.uk',
])

RestClient.get('www.example.org', '/') # ===> Allowed
RestClient.get('bbc.co.uk', '/')       # ===> Allowed
RestClient.get('bbc.com', '/')         # ===> Allowed
RestClient.get('www.bbc.com', '/')     # ===> Failure
```

## Net::HTTP.start 上のコネクト

HTTP プロトコルは3つのステップで出来ています。コネクト、リクエスト、レスポンスです（あるいはクローズが4つ目に入ることもあります）。ほとんどの Ruby HTTP クライアントライブラリはリクエストのステップの一部分としてコネクトを扱っていますが、`Net::HTTP` は違います。`Net::HTTP` は `Net::HTTP.start` を使用することによってサーバへのリクエストとは別々にコネクションをオープンすることができます。

WebMock API はリクエストのステップの一部分としてコネクトを行うように作られており、リクエストはスタブしますがコネクトはスタブしません。`Net::HTTP.start` が呼び出されたとき、WebMock はリクエストがスタブされるかどうかを知りません。デフォルトでは、WebMock はリクエストが実行されるまでコネクトを遅らせます。そのため、リクエストがないときは、`Net::HTTP.start` は何も行いません。
**これは、デフォルトでは WebMock は Net::HTTP の動作を中断させることを意味しています。**

この問題を解決するために、WebMock は `:net_http_connect_on_start` オプションを提供しています。このオプションは `WebMock.allow_net_connect!` と `WebMock.disable_net_connect!` に渡されます。

```ruby
WebMock.allow_net_connect!(net_http_connect_on_start: true)
```

これによって WebMock Net::HTTP adapter は常に `Net::HTTP.start` 上でコネクトをするようになります。

## 期待値の設定

### Test::Unit の期待値の設定

```ruby
require 'webmock/test_unit'

stub_request(:any, "www.example.com")

uri = URI.parse('http://www.example.com/')
req = Net::HTTP::Post.new(uri.path)
req['Content-Length'] = 3

res = Net::HTTP.start(uri.host, uri.port) do |http|
  http.request(req, 'abc')
end

assert_requested :post, "http://www.example.com",
  headers: {'Content-Length' => 3}, body: "abc",
  times: 1    # ===> Success

assert_not_requested :get, "http://www.something.com"    # ===> Success

assert_requested(:post, "http://www.example.com",
  times: 1) { |req| req.body == "abc" }
```

### スタブではない本当のリクエストの期待

```ruby
WebMock.allow_net_connect!

Net::HTTP.get('www.example.com', '/')    # ===> Success

assert_requested :get, "http://www.example.com"    # ===> Success
```

### スタブ上の Test::Unit の期待値の設定

```ruby
stub_get = stub_request(:get, "www.example.com")
stub_post = stub_request(:post, "www.example.com")

Net::HTTP.get('www.example.com', '/')

assert_requested(stub_get)
assert_not_requested(stub_post)
```

### `WebMock` モジュール上の RSpec の期待値の設定
この形式は [fakeweb-matcher](http://github.com/pat/fakeweb-matcher) を参考にしています。

```ruby
require 'webmock/rspec'

expect(WebMock).to have_requested(:get, "www.example.com").
  with(body: "abc", headers: {'Content-Length' => 3}).twice

expect(WebMock).not_to have_requested(:get, "www.something.com")

expect(WebMock).to have_requested(:post, "www.example.com").
  with { |req| req.body == "abc" }
# 括弧の代わりに `do ... end` ブロックを使用すると動作しないことに注意してください。
# 理由は https://github.com/bblimke/webmock/issues/174#issuecomment-34908908 をご覧ください。

expect(WebMock).to have_requested(:get, "www.example.com").
  with(query: {"a" => ["b", "c"]})

expect(WebMock).to have_requested(:get, "www.example.com").
  with(query: hash_including({"a" => ["b", "c"]}))

expect(WebMock).to have_requested(:get, "www.example.com").
  with(body: {"a" => ["b", "c"]},
    headers: {'Content-Type' => 'application/json'})
```

### `a_request` を使用した RSpec の期待値の設定

```ruby
expect(a_request(:post, "www.example.com").
  with(body: "abc", headers: {'Content-Length' => 3})).
  to have_been_made.once

expect(a_request(:post, "www.something.com")).to have_been_made.times(3)

expect(a_request(:post, "www.something.com")).to have_been_made.at_least_once

expect(a_request(:post, "www.something.com")).
  to have_been_made.at_least_times(3)

expect(a_request(:post, "www.something.com")).to have_been_made.at_most_twice

expect(a_request(:post, "www.something.com")).to have_been_made.at_most_times(3)

expect(a_request(:any, "www.example.com")).not_to have_been_made

expect(a_request(:post, "www.example.com").with { |req| req.body == "abc" }).
  to have_been_made

expect(a_request(:get, "www.example.com").with(query: {"a" => ["b", "c"]})).
  to have_been_made

expect(a_request(:get, "www.example.com").
  with(query: hash_including({"a" => ["b", "c"]}))).to have_been_made

expect(a_request(:post, "www.example.com").
  with(body: {"a" => ["b", "c"]},
    headers: {'Content-Type' => 'application/json'})).to have_been_made
```

### スタブ上の RSpec の期待値の設定

```ruby
stub = stub_request(:get, "www.example.com")
# ... make requests ...
expect(stub).to have_been_requested
```

## スタブとリクエスト履歴のリセット

すべてのスタブとリクエスト履歴をリセットしたいときは、`WebMock.reset!` を使用してください。

```ruby
stub_request(:any, "www.example.com")

Net::HTTP.get('www.example.com', '/')    # ===> Success

WebMock.reset!

Net::HTTP.get('www.example.com', '/')    # ===> Failure

assert_not_requested :get, "www.example.com"    # ===> Success
```

## リクエストカウンタのリセット

実行済みのリクエストカウンタ**のみ**をリセットしたいときは、`WebMock.reset_executed_requests!` を使用してください。

```ruby
stub  = stub_request(:get, "www.example.com")
stub2 = stub_request(:get, "www.example2.com")

Net::HTTP.get('www.example.com', '/')
Net::HTTP.get('www.example.com', '/')

Net::HTTP.get('www.example2.com', '/')

expect(stub).to have_been_requested.times(2)
expect(stub2).to have_been_requested.times(1)

WebMock.reset_executed_requests!

expect(stub).not_to have_been_requested
expect(stub2).not_to have_been_requested
```

## WebMock または HTTP クライアントアダプタのみの無効化と有効化

```ruby
# WebMock の無効化（全アダプタ）
WebMock.disable!

# Net::HTTP を除くすべてのライブラリの WebMock の無効化
WebMock.disable!(except: [:net_http])

# WebMock の有効化（全アダプタ）
WebMock.enable!

# Patron を除くすべてのライブラリの WebMock の有効化
WebMock.enable!(except: [:patron])
```

## リクエストのマッチ

下記の基準を満たすとき、実行されたリクエストはスタブリクエストとマッチします。

- リクエスト URI がスタブリクエストの URI 、正規表現、RFC 6570 URI テンプレートとマッチするとき。
- かつ、リクエストメソッドがスタブクリエストのものと同じとき、あるいはスタブリクエストのメソッドが :any のとき。
- かつ、リクエストボディがスタブクリエストのものと同じとき、あるいはスタブリクエストのボディが指定されていないとき。
- かつ、リクエストヘッダがスタブリクエストヘッダとマッチするとき、あるいはスタブリクエストヘッダがリクエストヘッダのサブセットとマッチするとき、あるいはスタブリクエストヘッダが指定されないとき。
- かつ、リクエストが与えられたブロックにマッチするとき、あるいはブロックが与えられていないとき。

## スタブの優先順位

最後に宣言された、リクエストにマッチするスタブが常に適用されます。

```ruby
stub_request(:get, "www.example.com").to_return(body: "abc")
stub_request(:get, "www.example.com").to_return(body: "def")

Net::HTTP.get('www.example.com', '/')    # ====> "def"
```

## URI のマッチ

WebMock は同じ URI のすべての異なった表現形式とマッチします。

下記のすべての URI の表現形式は同じ URI として扱われます。

```ruby
"www.example.com"
"www.example.com/"
"www.example.com:80"
"www.example.com:80/"
"http://www.example.com"
"http://www.example.com/"
"http://www.example.com:80"
"http://www.example.com:80/"
```

下記のユーザー情報をともなった URI は同じ URI として扱われます。

```ruby
"a b:pass@www.example.com"
"a b:pass@www.example.com/"
"a b:pass@www.example.com:80"
"a b:pass@www.example.com:80/"
"http://a b:pass@www.example.com"
"http://a b:pass@www.example.com/"
"http://a b:pass@www.example.com:80"
"http://a b:pass@www.example.com:80/"
"a%20b:pass@www.example.com"
"a%20b:pass@www.example.com/"
"a%20b:pass@www.example.com:80"
"a%20b:pass@www.example.com:80/"
"http://a%20b:pass@www.example.com"
"http://a%20b:pass@www.example.com/"
"http://a%20b:pass@www.example.com:80"
"http://a%20b:pass@www.example.com:80/"
```

下記も同様です。

```ruby
"www.example.com/my path/?a=my param&b=c"
"www.example.com/my%20path/?a=my%20param&b=c"
"www.example.com:80/my path/?a=my param&b=c"
"www.example.com:80/my%20path/?a=my%20param&b=c"
"http://www.example.com/my path/?a=my param&b=c"
"http://www.example.com/my%20path/?a=my%20param&b=c"
"http://www.example.com:80/my path/?a=my param&b=c"
"http://www.example.com:80/my%20path/?a=my%20param&b=c"
```

正規表現を使用して URI をマッチさせる場合、WebMock は同じ URL のすべての有効な形式を使用して URI をマッチさせます。

つまり、`www.example.com/my path` と同等とみなすので、`/my path/` は `www.example.com/my%20path` とマッチします。

## URI Templates のマッチング

マッチングのために [Addressable::Template](https://github.com/sporkmonger/addressable#uri-templates) を使用している場合は、WebMock は Addressable に対するマッチングルールを延期し、[RFC 6570](http://tools.ietf.org/html/rfc6570) に従います。

クエリパラメーターをマッチさせるために任意の WebMock のメソッドを使用している場合は、Addressable はベース URI とマッチするために使用され、WebMock はクエリパラメーターとマッチします。

## ヘッダのマッチング

下記の状況において WebMock はスタブされたリクエストヘッダを使用してリクエストヘッダとマッチします。

1. スタブリクエストはヘッダを指定されていて、リクエストヘッダはスタブされたヘッダと同じ<br/>
スタブされたヘッダ: `{ 'Header1' => 'Value1', 'Header2' => 'Value2' }`, リクエストされたヘッダ: `{ 'Header1' => 'Value1', 'Header2' => 'Value2' }`

2. スタブリクエストはヘッダを指定されていて、スタブされたリクエストヘッダはリクエストヘッダのサブセット<br/>
スタブされたヘッダ: `{ 'Header1' => 'Value1'  }`, リクエストされたヘッダ: `{ 'Header1' => 'Value1', 'Header2' => 'Value2' }`

3. スタブリクエストがヘッダを持っていない<br/>
スタブされたヘッダ: `nil`, リクエストされたヘッダ: `{ 'Header1' => 'Value1', 'Header2' => 'Value2' }`

WebMock はヘッダを標準化し、同じヘッダのすべての形式を同じものとして扱います。
つまり、下記のヘッダの組み合わせは同じものとして扱われます。

`{ "Header1" => "value1", content_length: 123, X_CuStOm_hEAder: :value }`

`{ header1: "value1",  "Content-Length" => 123, "x-cuSTOM-HeAder" => "value" }`

## 本物のリクエストとレスポンスの記録とそのリプレイ

アプリケーションの本物の HTTP のやり取りを記録し、それをテストの中でリプレイするためには、WebMock とともに gem [VCR](https://github.com/vcr/vcr) を使用することができます。

## リクエストのコールバック

#### WebMock はスタブされたあるいは本物のリクエストのコールバックを引き起こすことができる

```ruby
WebMock.after_request do |request_signature, response|
  puts "Request #{request_signature} was made and #{response} was returned"
end
```

#### Patron で作成されたリクエストは除き、本物のリクエストのみコールバックを引き起こす

```ruby
WebMock.after_request(except: [:patron],
                      real_requests_only: true) do |req_signature, response|
  puts "Request #{req_signature} was made and #{response} was returned"
end
```

## Bugs and Issues

Please submit them here [http://github.com/bblimke/webmock/issues](http://github.com/bblimke/webmock/issues)

## Issue triage [![Open Source Helpers](https://www.codetriage.com/bblimke/webmock/badges/users.svg)](https://www.codetriage.com/bblimke/webmock)

You can contribute by triaging issues which may include reproducing bug reports or asking for vital information, such as version numbers or reproduction instructions. If you would like to start triaging issues, one easy way to get started is to [subscribe to webmock on CodeTriage](https://www.codetriage.com/bblimke/webmock).

## Suggestions

If you have any suggestions on how to improve WebMock please send an email to the mailing list [groups.google.com/group/webmock-users](http://groups.google.com/group/webmock-users)

I'm particularly interested in how the DSL could be improved.

## Development

In order to work on Webmock you first need to fork and clone the repo.
Please do any work on a dedicated branch and rebase against master
before sending a pull request.

## Credits

The initial lines of this project were written during New Bamboo [Hack Day](http://blog.new-bamboo.co.uk/2009/11/13/hackday-results)
Thanks to my fellow [Bambinos](http://new-bamboo.co.uk/) for all the great suggestions!

People who submitted patches and new features or suggested improvements. Many thanks to these people:

* Ben Pickles
* Mark Evans
* Ivan Vega
* Piotr Usewicz
* Nick Plante
* Nick Quaranto
* Diego E. "Flameeyes" Pettenò
* Niels Meersschaert
* Mack Earnhardt
* Arvicco
* Sergio Gil
* Jeffrey Jones
* Tekin Suleyman
* Tom Ward
* Nadim Bitar
* Myron Marston
* Sam Phillips
* Jose Angel Cortinas
* Razic
* Steve Tooke
* Nathaniel Bibler
* Martyn Loughran
* Muness Alrubaie
* Charles Li
* Ryan Bigg
* Pete Higgins
* Hans de Graaff
* Alastair Brunton
* Sam Stokes
* Eugene Bolshakov
* James Conroy-Finn
* Salvador Fuentes Jr
* Alex Rothenberg
* Aidan Feldman
* Steve Hull
* Jay Adkisson
* Zach Dennis
* Nikita Fedyashev
* Lin Jen-Shin
* David Yeu
* Andreas Garnæs
* Roman Shterenzon
* Chris McGrath
* Stephen Celis
* Eugene Pimenov
* Albert Llop
* Christopher Pickslay
* Tammer Saleh
* Nicolas Fouché
* Joe Van Dyk
* Mark Abramov
* Frank Schumacher
* Dimitrij Denissenko
* Marnen Laibow-Koser
* Evgeniy Dolzhenko
* Nick Recobra
* Jordan Elver
* Joe Karayusuf
* Paul Cortens
* jugyo
* aindustries
* Eric Oestrich
* erwanlr
* Ben Bleything
* Jon Leighton
* Ryan Schlesinger
* Julien Boyer
* Kevin Glowacz
* Hans Hasselberg
* Andrew France
* Jonathan Hyman
* Rex Feng
* Pavel Forkert
* Jordi Massaguer Pla
* Jake Benilov
* Tom Beauvais
* Mokevnin Kirill
* Alex Grant
* Lucas Dohmen
* Bastien Vaucher
* Joost Baaij
* Joel Chippindale
* Murahashi Sanemat Kenichi
* Tim Kurvers
* Ilya Vassilevsky
* gotwalt
* Leif Bladt
* Alex Tomlins
* Mitsutaka Mimura
* Tomy Kaira
* Daniel van Hoesel
* Ian Asaff
* Ian Lesperance
* Matthew Horan
* Dmitry Gutov
* Florian Dütsch
* Manuel Meurer
* Brian D. Burns
* Riley Strong
* Tamir Duberstein
* Stefano Uliari
* Alex Stupakov
* Karen Wang
* Matt Burke
* Jon Rowe
* Aleksey V. Zapparov
* Praveen Arimbrathodiyil
* Bo Jeanes
* Matthew Conway
* Rob Olson
* Max Lincoln
* Oleg Gritsenko
* Hwan-Joon Choi
* SHIBATA Hiroshi
* Caleb Thompson
* Theo Hultberg
* Pablo Jairala
* Insoo Buzz Jung
* Carlos Alonso Pérez
* trlorenz
* Alexander Simonov
* Thorbjørn Hermanse
* Mark Lorenz
* tjsousa
* Tasos Stathopoulos
* Dan Buettner
* Sven Riedel
* Mark Lorenz
* Dávid Kovács
* fishermand46
* Franky Wahl
* ChaYoung You
* Simon Russell
* Steve Mitchell
* Mattias Putman
* Zachary Anker
* Emmanuel Sambo
* Ramon Tayag
* Johannes Schlumberger
* Siôn Le Roux
* Matt Palmer
* Zhao Wen
* Krzysztof Rygielski
* Magne Land
* yurivm
* Mike Knepper
* Charles Pence
* Alexey Zapparov
* Pablo Brasero
* Cedric Pimenta
* Michiel Karnebeek
* Alex Kestner
* Manfred Stienstra
* Tim Diggins
* Gabriel Chaney
* Chris Griego
* Taiki Ono
* Jonathan Schatz
* Jose Luis Honorato
* Aaron Kromer
* Pavel Jurašek
* Jake Worth
* Gabe Martin-Dempesy
* Michael Grosser
* Aleksei Maridashvili
* Ville Lautanala
* Koichi ITO
* Jordan Harband
* Tarmo Tänav
* Joe Marty
* Chris Thomson
* Vít Ondruch
* George Ulmer
* Christof Koenig
* Chung-Yi Chi
* Olexandr Hoshylyk
* Janko Marohnić
* Pat Allan
* Rick Song
* NARUSE, Yui
* Piotr Boniecki
* Olia Kremmyda
* Michał Matyas
* Matt Brictson
* Kenny Ortmann
* redbar0n
* Lukas Pokorny
* Arkadiy Tetelman
* Kazato Sugimoto
* Olle Jonsson
* Pavel Rosický
* Geremia Taglialatela
* Koichi Sasada
* Yusuke Endoh
* Grey Baker
* SoonKhen OwYong
* Pavel Valena
* Adam Sokolnicki
* Jeff Felchner
* Eike Send
* Claudio Poli
* Csaba Apagyi
* Frederick Cheung
* Fábio D. Batista
* Andriy Yanko
* y-yagi
* Rafael França
* George Claghorn
* Alex Junger
* Orien Madgwick
* Andrei Sidorov
* Marco Costa
* Ryan Davis
* Brandur
* Samuel Williams
* Patrik Ragnarsson
* Alex Coomans
* Vesa Laakso

For a full list of contributors you can visit the
[contributors](https://github.com/bblimke/webmock/contributors) page.

## Background

Thank you Fakeweb! This library was inspired by [FakeWeb](http://fakeweb.rubyforge.org).
I imported some solutions from that project to WebMock. I also copied some code i.e Net:HTTP adapter.
Fakeweb architecture unfortunately didn't allow me to extend it easily with the features I needed.
I also preferred some things to work differently i.e request stub precedence.

## Copyright

Copyright (c) 2009-2010 Bartosz Blimke. See LICENSE for details.