RubyのHTTPリクエストには、スタブと予想を設定するためのライブラリ。
低いHTTPクライアントLIBレベルでのスタブHTTP要求(HTTPライブラリを変更するときにテストを変更する必要はありません)
HTTPリクエストでの期待の設定と検証
メソッド、URI、ヘッダー、ボディに基づく一致リクエスト
異なる表現における同じURIのスマートマッチング(エンコードされたフォームと非エンコード形式)
異なる表現の同じヘッダーのスマートマッチング。
テストのサポート::ユニット
RSPECのサポート
Minitestのサポート
async :: http :: client
縁石(現在の縁石のみ::簡単)
em-http-request
excon
httpclient
http gem(http.rbとも呼ばれます)
httpx
Manticore
net :: httpおよびnetに基づくその他のライブラリ:: http、例:
httparty
休憩クライアント
パトロン
Typhoeus(現在Typhoeus :: Hydraのみ)
MRI 2.6
MRI 2.7
MRI 3.0
MRI 3.1
MRI 3.2
MRI 3.3
Jruby
gemインストールwebmock
または、または:
#GEMFILEGROUPに追加:テストします gem "webmock" end
git clone http://github.com/bblimke/webmock.gitcd webmock レーキインストール
WebMock 2.xは、バージョン1.x以降、いくらか変化しました。変更はchangelog.mdにリストされています
次の内容を持つファイルfeatures/support/webmock.rb
を作成します。
「webmock/cucumber」が必要です
次のコードをtest/test_helper
に追加します。
「webmock/minitest」が必要です
次のコードをspec/spec_helper
に追加します。
「webmock/rspec」が必要です
次のコードをtest/test_helper.rb
に追加します
「webmock/test_unit」が必要です
テストフレームワークの外でWebMockを使用することもできます。
'webmock'include webmock :: apiwebmock.enableが必要です!
Stub_Request(:any、 "www.example.com")net :: http.get( "www.example.com"、 "/")#===>成功
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'] = 3res = net :: http.start(uri.host、uri.port)do | http | http.request(req、 "abc")end#===>成功
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#===>成功
Stub_Request(:post、 "www.example.com")。 with(body:{data:{a: '1'、b: 'vive'}})restclient.post( 'www.example.com'、 "data [a] = 1&data [b] = five"、 content_type: 'application/x-www-form-urlencoded')#===> successrestclient.post( 'www.example.com'、 '{"data":{"a": "1"、 "b": "五"}}'、 content_type: 'application /json')#===> successrestclient.post( 'www.example.com'、 '<data a = "1" b = "5" />'、 content_type: 'application/xml')#===>成功
Stub_Request(:post、 "www.example.com")。 with(body:hash_including({data:{a: '1'、b: '5'}}))restclient.post( 'www.example.com'、 "data [a] = 1&data [b] = five&x = 1 "、:content_type => 'application/x-www-form-urlencoded')#===>成功
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#===>成功
stub_request(:get、 'www.example.com')。 with(headers:{'Accept' => ['image/jpeg'、 'image/png']}) image/png '] req.add_field(' accept '、' image/jpeg ')net :: http.start( "www.example.com"){| http | http.request(req)}#===>成功
stub_request(:post、 "www.example.com")。{| request | request.body == "abc"} restclient.post( 'www.example.com'、 'abc')#===>成功
stub_request(:get、 "www.example.com")。 {'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)終了#===>成功
stub_request(:get, "user:[email protected]")
承認ヘッダーで提供される資格情報とリクエストと一致しません。stub_request(:get、 "user:[email protected]")restclient.get( 'user:[email protected]')#===>成功
stub_request(any、/example/)net ::http.get('www.example.com '、'/')#===>成功
stub_request(:any、 - >(uri){true})
uri_template = addressable :: template.new "www.example.com/ {id }/"stub_request(:any、uri_template)net :: http.get( 'www.example.com'、 '/webmock/')#= ==>成功
uri_template = アドレス可能:: template.new "www.example.com/thing/thid.json {?x、,z} {&atother*}" stub_request(:any、uri_template)net :: http.get( 'www。 example.com '、 '/hishing/5.json?x=1&y=2&z=3&anyparam=4')#===>成功
stub_request(:get、 "www.example.com")。 ?a [] = b&a [] = c ")#===>成功
stub_request(:get、 "www.example.com")。 with(query:hash_including({"a" => ["b"、 "c"]}))retyclient.get( "http://www.example.com/?a•a造1 ")#===>成功
stub_request(:get、 "www.example.com")。 with with(query:hash_excluding({"a" => "b"}))restclient.get( "http://www.example.com/?a = b")#===> failurerestclient.get( "http ://www.example.com/?a = c ")#===>成功
stub_request(:any、 "www.example.com")。 to_return(body: "abc"、status:200、headers:{'content-length' => 3})net :: http.get( "www.example.com"、 '/')#===> " ABC "
httpartyのparsed_response
の適切なコンテンツタイプを設定します。
stub_request(:any、 "www.example.com")。to_return body: '{}'、headers:{content_type: 'application/json'}
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'、 '/')#===> "abcn"
stub_request(:any、 "www.example.com")。 to_return_json(body:{foo: "bar"})net :: http.get( 'www.example.com'、 '/')#===> "{" foo ":" bar "}"
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)}。 メッセージ#===>「内部サーバーエラー」
curl -is
で記録された生の応答を再生しますcurl -is www.example.com > /tmp/example_curl_-is_output.txt
raw_response_file = file.new( "/tmp/example_curl_-is_output.txt")
ファイルから
stub_request(:get、 "www.example.com")。to_return(raw_response_file)
または文字列
stub_request(:get、 "www.example.com")。to_return(raw_response_file.read)
stub_request(:any、 'www.example.net')。 to_return {| request | {body:request.body}} restclient.post( 'www.example.net'、 'abc')#===> "abcn"
stub_request(:any、 'www.example.net')。 to_return(lambda {| request | {body:request.body}})restclient.post( 'www.example.net'、 'abc')#===> "abcn"
curl -is
で記録された生の応答を動的に評価しましたcurl -is www.example.com > /tmp/www.example.com.txt
stub_request(:get、 "www.example.com")。 to_return(lambda {| request | file.new( "/tmp/#{request.uri.host.to_s} .txt")}))
stub_request(:any、 'www.example.net')。 to_return(body:lambda {| request | request.body})restclient.post( 'www.example.net'、 'abc')#===> "abcn"
クラスmyrackapp def self.call(env)[200、{}、["hello"]] endendstub_request(:get、 "www.example.com")
stub_request(:any、 'www.example.net')。to_raise(starndererror)restclient.post( 'www.example.net'、 'abc')#===> stardenterror
stub_request(any、 'www.example.net')。to_raise(stardenterror.new( "some error"))
stub_request(:any、 'www.example.net')。to_raise( "some error")
Stub_Request(:any、 'www.example.net')
stub_request(:get、 "www.example.com")。 to_return({body: "abc"}、{body: "def"})net :: http.get( 'www.example.com'、 '/')#===> "abcn" net :: http。 get( 'www.example.com'、 '/')#===> "defn" #afterすべての応答が使用されます最後の応答は無限に返されます:: http.get( 'www.example.com'、 ' /')#===>「defn」
to_return()
、 to_raise()
またはto_timeout
宣言を使用した複数の応答stub_request(:get、 "www.example.com")。 to_return({body: "abc"})。 #then()は単なる構文砂糖です to_return({body: "def"})。 to_raise(myexception)net :: http.get( 'www.example.com'、 '/')#===> "abcn" net :: http.get( 'www.example.com'、 '/') #===> "defn" net :: http.get( 'www.example.com'、 '/')#===> myexceptionが上昇しました
stub_request(:get、 "www.example.com")。 to_return({body: "abc"})。times(2).then。 to_return({body: "def"})net :: http.get( 'www.example.com'、 '/')#===> "abcn" net :: http.get( 'www.example.com '、'/')#===> "abcn" net :: http.get(' www.example.com '、'/')#=== "defn"
stub_get = stub_request(:get、 "www.example.com")remove_request_stub(stub_get)
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 '、'/')#===>失敗
webmock.disable_net_connect!(lowt_localhost:true)net :: http.get( 'www.something.com' '、'/')#===> failurenet :: http.get(' localhost:9887 '、'/') #===>許可。おそらくセレンに?
許可されたリクエストは、さまざまな方法で指定できます。
ホスト名を指定するString
付き:
webmock.disable_net_connect!(low: 'www.example.org')restclient.get( 'www.something.com'、 '/')#===> failurerestclient.get( 'www.example.org'、 '/'/'/ ')#===> AldocatrestClient.get(' www.example.org:8080 '、'/')#===>許可
ホスト名とポートを指定するString
付き:
webmock.disable_net_connect!(low: 'www.example.org:8080')restclient.get('www.something.com'、 '/')#===> failurerestclient.get( 'www.example.org' '、 '/')#===> FAILURERESTCLIENT.get( 'www.example.org:8080'、 '/')#===>許可
URIに一致するRegexp
で:
webmock.disable_net_connect!(lock:%r {ample.org/foo})restclient.get( 'www.example.org'、 '/foo/bar')#===> approadrestclient.get( 'sample.org' ' 、 '/foo')#===> AldocationRestClient.get( 'sample.org'、 '/bar')#===>失敗
#call
に応答するオブジェクトで、 URI
オブジェクトを受信し、ブール値を返します。
denyrist = ['google.com'、 'facebook.com'、 'apple.com'] Aldual_sites = lambda {| uri | denyrist.none?{| site | uri.host.include?(site)}} webmock.disable_net_connect!(alawt:aotad_sites)restclient.get( 'www.example.org'、 '/')#===> approadrestclient.get( 'www.facebook。 com '、'/')#===> failurerestclient.get(' apple.com '、'/')#===>失敗
上記のいずれかのArray
で:
webmock.disable_net_connect!(low:[[ lambda {| uri | uri.host.length%2 == 0}、 /ample.org/、 'bbc.co.uk'、])restclient.get( 'www.example.org'、 '/')#===> adpoldrestclient.get( 'bbc.co.uk'、 '/')== => AldoceRrestClient.get( 'bbc.com'、 '/')#===> AldoceRestClient.get( 'www.bbc.com'、 '/')#===> fails
HTTPプロトコルには、接続、要求、応答の3つのステップがあります(または4つの接近)。ほとんどのRuby HTTPクライアントライブラリは、 Net::HTTP.start
を使用して、 Net::HTTP
を除きます。
WebMock APIは、Connectがリクエストステップの一部であることで設計されており、接続ではなくスタブリクエストのみを許可します。 Net::HTTP.start
が呼び出されると、WebMockは要求がスタブかどうかをまだ知りません。 WebMockはデフォルトでリクエストが呼び出されるまで接続を遅らせるため、リクエストがない場合、 Net::HTTP.start
何もしません。これは、WebMockがデフォルトでネット:: HTTP動作を破ることを意味します!
この問題を回避するために、WebMockは次のとおりです:net_http_connect_on_start
オプションは、 WebMock.allow_net_connect!
およびWebMock.disable_net_connect!
方法、すなわち
webmock.allow_net_connect!(net_http_connect_on_start:true)
これにより、webmock net :: httpアダプターが常にNet::HTTP.start
。接続の時点では、要求やURLに関する情報はまだありません。したがって、WebMockはリクエストをスタブするかどうかを決定できず、すべての接続が許可されています。特定のドメインへのみ接続を有効にするには(テストサーバーなど)使用します。
webmock.allow_net_connect!(net_http_connect_on_start: "www.example.com")
'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'] = 3res = net :: http.start(uri.host、uri.port)do | http | http.request(req、 'abc')endassert_requested:post、 "http://www.example.com"、 ヘッダー:{'content-length' => 3}、body: "abc"、 時間:1#===> successAssert_not_requested:get、 "http://www.something.com"#===> successAssert_Requested(:post、 "http://www.example.com"、 時間:1){| req | req.body == "abc"}
webmock.allow_net_connect!net :: http.get( 'www.example.com'、 '/')#===> successAssert_Requested:get、 "http://www.example.com"#===>成功
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から借用されています
'webmock/rspec'expect(webmock)を必要とします。 with(body: "abc"、headers:{'content-length' => 3})投稿、「www.example.com」)。 {| req |でreq.body == "abc"}#巻き括弧の代わりに「do ... end」を持つブロックが機能しないことに注意してください!#なぜですか?このコメントを参照してくださいhttps://github.com/bblimke/webmock/issues/174#issuecomment-34908908expect (webmock).to have_requested(:get、 "www.example.com")。 with(query:{"a" => ["b"、 "c"]})は(webmock)。 with(query:hash_including({"a" => ["b"、 "c"]})を期待しています(webmock)。 with(body:{"a" => ["b"、 "c"]}、ヘッダー:{'content-type' => 'application/json'})
a_request
を使用してRSPECで期待を設定しますexpect(a_request(:post、 "www.example.com")。 with(body: "abc"、headers:{'content-length' => 3}))。 have_been_made.onceexpect(a_request(:post、 "www.something.com")) (:投稿、 "www.something.com"))。 have_been_made.at_least_times(3)は(a_request(:post、 "www.something.com"))を期待しています)(a_request(:any、 "www.example.com")))。 。 have_been_madexpect(a_request(:get、 "www.example.com")。 have_been_madeexpect(a_request(:get、 "www.example.com")。 with(query:hash_including({"a" => ["b"、 "c"]})))。 with(body:{"a" => ["b"、 "c"]}、headers:{'content-type' => 'application/json'})
stub = stub_request(:get、 "www.example.com")
現在のすべてのスタブとリクエストの履歴をリセットする場合は、 WebMock.reset!
Stub_Request(:any、 "www.example.com")net :: http.get( 'www.example.com'、 '/')#===> successwebmock.reset!net :: http.get( 'www .example.com '、'/')#===> failureassert_not_requested:get、 "www.example.com"#===> success
実行されたリクエストのカウンターのみをリセットする場合は、 WebMock.reset_executed_requests!
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)が期待する(stub2).to have_been_requested.times(1)webmock.reset_executed_requests!
#Webmock(すべてのアダプター)webmock.disable! patronwebmock.enable!を除く!(を除く:[:patron])
実行されたリクエストは、次の基準を渡す場合、スタブリクエストと一致します。
リクエストの場合、URIがスタブリクエストURI文字列、Regexpパターン、またはRFC 6570 URIテンプレートに一致するとき
リクエスト方法は、スタブリクエストメソッドまたはスタブリクエスト方法と同じです。
リクエスト本体はスタブリクエストボディまたはスタブリクエストボディが指定されていないことと同じです
リクエストヘッダーマッチスタブリクエストヘッダー、またはスタブのリクエストヘッダーはリクエストヘッダーのサブセットを一致させるか、スタブのリクエストヘッダーが指定されていません
ブロックまたはブロックが提供されていないリクエストマッチが提供されていません
常にリクエストに一致する最後の宣言されたスタブが適用されます。
stub_request(:get、 "www.example.com") ( 'www.example.com'、 '/')#====> "def"
WebMockは、同じURIのすべての異なる表現と一致します。
つまり、URIの次のすべての表現は等しい:
"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/ "
userInfoを備えた次のurisもwebmockに等しい
「A B:[email protected] "" a b:[email protected]/"" a b:[email protected]:80 "" a b:[email protected]:80/" "http:// a b:[email protected]" "http:// a b:[email protected]/" "http:// :// b:[email protected]:80/"" a%20b:[email protected] "" a%20b:[email protected]/"" a%20b:pass@ www.example.com:80""""ro%20b:[email protected]:80/""http://a%20b:[email protected]""http://a%20b: [email protected]/ "" http:// a%20b:[email protected]:80 "" http:// a%20b:[email protected]:80/"
またはこれら
"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を一致させるためにRegexpを提供する場合、WebMockは同じURLのすべての有効なフォームと一致しようとします。
IE /my path/
www.example.com/my%20path
に一致します。これはwww.example.com/my path
に相当するためです。
アドレス可能な::マッチングにテンプレートを使用する場合、WebMockはRFC 6570に準拠する一致するルールをアドレス可能に延期します。
クエリパラメーションを一致させるためにWebMockメソッドのいずれかを使用する場合、アドレス可能な場合、ベースURIと一致するためにアドレス可能になり、WebMockはクエリパラメーションと一致します。 そうでない場合、WebMockはアドレス可能なURIと一致します。
WebMockは、次の状況では、リクエストヘッダーをスタブリクエストヘッダーと一致させます。
スタブリクエストにはヘッダーが指定されており、リクエストヘッダーはスタブヘッダーと同じです
IEスタブヘッダー: { 'Header1' => 'Value1', 'Header2' => 'Value2' }
、要求: { 'Header1' => 'Value1', 'Header2' => 'Value2' }
スタブリクエストには、ヘッダーが指定されており、スタブリクエストヘッダーはリクエストヘッダーのサブセットです
IEスタブヘッダー: { 'Header1' => 'Value1' }
、要求: { 'Header1' => 'Value1', 'Header2' => 'Value2' }
スタブリクエストにはヘッダーがありません
IEスタブヘッダー: nil
、要求: { 'Header1' => 'Value1', 'Header2' => 'Value2' }
WebMockはヘッダーを正常化し、同じヘッダーのあらゆる形態を等しいものと扱います。つまり、次の2つのヘッダーセットは等しい:
{ "Header1" => "value1", content_length: 123, X_CuStOm_hEAder: :value }
{ header1: "value1", "Content-Length" => 123, "x-cuSTOM-HeAder" => "value" }
アプリケーションの実際のHTTPインタラクションを記録し、後でテストで再生するには、WebMockでVCRを使用できます。
webmock.after_request do | request_signature、response | puts "request#{request_signature}が作成され、#{response}が返されました
webmock.after_request([:patron]、real_requests_only:true)do | req_signature、response | puts "request#{req_signature}が作成され、#{response}が返されました
ここにhttp://github.com/bblimke/webmock/issuesを提出してください
バグレポートの再現やバージョン番号や複製の指示などの重要な情報を要求することを含むトリアージの問題によって貢献できます。トリアージングの問題を開始したい場合は、簡単に開始する方法の1つは、CodetirageでWebmockを購読することです。
Webmockの改善方法について何か提案がある場合は、メーリングリストグループにメールを送信してください。google.com/group/webmock-users
DSLをどのように改善できるかに特に興味があります。
WebMockで作業するには、最初にレポをフォークしてクローンする必要があります。プルリクエストを送信する前に、専用のブランチで作業を行い、マスターに反論してください。
このプロジェクトの最初の行は、すべての素晴らしい提案をしてくれた私の仲間のバンビノのおかげで、新しい竹ハックの日に書かれました!
パッチや新機能を提出した人、または改善を提案した人。これらの人々に感謝します:
ベンピクルス
マーク・エヴァンス
イヴァンベガ
piotr usewicz
ニック・プランテ
ニック・バリント
ディエゴE. "flameeyes"Pettenò
ニールス・ミアーズシャート
マック・アーンハート
Arvicco
セルジオ・ギル
ジェフリー・ジョーンズ
テキン・スーリーマン
トム・ウォード
ナディム・ビター
マイロン・マーストン
サム・フィリップス
ホセ・エンジェル・コルティナス
ラジック
スティーブも
ナサニエル・ビブラー
マーティン・ラフラン
ムネス・アルバイ
チャールズ・リー
ライアン・ビッグ
ピート・ヒギンズ
ハンス・ド・グラフ
Alastair Brunton
サム・ストークス
ユージン・ボルシャコフ
ジェームズ・コンロイ・フィン
Salvador Fuentes Jr
アレックス・ロセンバーグ
エイダンフェルドマン
スティーブ・ハル
ジェイ・アドキソン
ザック・デニス
ニキータ・フェディアシェフ
リン・ジェン・シン
デビッド・ヨー
アンドレアス・ガルナス
ローマのシェテンゾン
クリス・マクグラス
スティーブンセリス
ユージン・ピメノフ
アルバートllop
クリストファー・ピクスレイ
Tammer Saleh
ニコラス・フーシェ
ジョー・ヴァン・ダイク
マーク・アブラモフ
フランク・シューマッハ
Dimitrij Denissenko
Marnen Laibow-Koser
evgeniy dolzhenko
ニック・レコブラ
ジョーダン・エルバー
Joe Karayusuf
ポール・コルテンズ
ジュギョ
AINDUSTRIES
エリック・オエストリヒ
erwanlr
Ben Bleything
ジョンレイトン
ライアン・シュレシンガー
ジュリアン・ボイヤー
ケビン・グロワッツ
ハンス・ハッセルバーグ
アンドリュー・フランス
ジョナサン・ハイマン
レックス・フェン
Pavel Forkert
Jordi Massaguer Pla
ジェイク・ベニロフ
トム・ボーヴァイス
Mokevnin Kirill
アレックス・グラント
ルーカス・ドーメン
バスティエン・ヴォーチャー
JoostBaaij
ジョエル・チッピンデール
ムラハシ・サネマト・ケニチ
ティム・カルバーズ
Ilya Vassilevsky
ゴトワルト
レイフ・ブラット
アレックス・トムリンズ
ミムラ・ミツタカ
トミー・カイラ
ダニエル・ヴァン・ホーゼル
Ian Asaff
イアン・レスペランス
マシュー・ホーラン
ドミトリー・グトフ
FlorianDütsch
マヌエル・メーラー
ブライアンD.バーンズ
ライリー・ストロング
Tamir Duberstein
ステファノウリアリ
アレックス・スパコフ
カレン・ワン
マット・バーク
ジョン・ロウ
アレクシーV.ザパロフ
Praveen Arimbrathodiyil
BO JEANES
マシュー・コンウェイ
ロブ・オルソン
マックスリンカーン
Oleg Gritsenko
ファン・ジュン・チェ
シバタ・ヒロシ
カレブ・トンプソン
Theo Hultberg
パブロ・ジャイララ
Insoo Buzz Jung
カルロス・アロンソ・ペレス
Trlorenz
アレクサンダー・シモノフ
ThorbjørnHermanse
マーク・ロレンツ
Tjsousa
Tasos Stathopoulos
ダン・ビュットナー
スヴェン・リーデル
マーク・ロレンツ
DávidKovács
漁業46
フランキー・ワール
あなたをチャヨン
サイモンラッセル
スティーブミッチェル
マティアス・パットマン
ザカリー・アンカー
エマニュエル・サンボ
ラモン・テヤグ
Johannes Schlumberger
siônleroux
マット・パーマー
zhao wen
krzysztof rygielski
マグネランド
Yurivm
マイク・ネッパー
チャールズ・ペンス
アレクセイ・ザパロフ
パブロ・ブラセロ
セドリックピマン
Michiel Karnebeek
アレックス・ケストナー
マンフレッド・スティエンストラ
ティム・ディギンズ
ガブリエル・チェイニー
クリス・グリーゴ
太陽小屋
ジョナサン・シャッツ
ホセ・ルイス・オナート
アーロン・クロマー
パベル・ジュラシェク
ジェイクワース
Gabe Martin-Dempesy
マイケル・グロッサー
Aleksei Maridashvili
ヴィル・ラウタナラ
伊藤島
ジョーダンハーバンド
TarmoTänav
ジョーマーティ
クリス・トムソン
ondruch
ジョージ・ウルマー
クリストフ・ケーニヒ
chung-yi chi
olexandr hoshylyk
ジャンコ・マロニッチ
パット・アラン
リックの歌
ナルーゼ、ユイ
Piotr Boniecki
オリア・クレミーダ
MichałMatyas
マット・ブリクトソン
ケニー・オートマン
redbar0n
ルーカス・ポコニー
Arkadiy Tetelman
杉本星
オル・ジョンソン
パベル・ロジキ
ジェレミア・タリアラテラ
佐々木小川
Yusuke endoh
灰色のベイカー
Soonkhen Owyong
Pavel Valena
アダム・ソコルニキ
ジェフ・フェルチナー
eike send
クラウディオ・ポリ
csaba apagyi
フレデリック・チョン
ファビオ・D・バティスタ
アンドリー・ヤンコ
y-yagi
ラファエル・フランサ
ジョージ・クラゴーン
アレックス・ジンジャー
オリエン・マジウィック
アンドレイ・シドロフ
マルコ・コスタ
ライアン・デイビス
Brandur
サミュエル・ウィリアムズ
パトリック・ラグナーソン
アレックスクーマン
Vesa Laakso
ジョン・ホーソーン
guppy0356
ティロ・ラッシュ
アンドリュー・スタンツ
ルーカス・ウエズ
ブルーノ・スーティック
ライアン・カー
アダム・ハーウッド
ベンコシ
ジェシー・ボウズ
マレク・カズテルニク
CE07C3
ジュン・ジャン
Oleksiy Kovyrin
マット・ララズ
トニー・シュナイダー
ニクラス・ヘスル
ヨハンナ・ハートマン
アレックス・ヴォンドラック
ストーリーになります
エドゥアルド・ヘルナンデス
ojab
ジョルジオガンビーノ
ティムミットリー
マイケル・フェアリー
レイゼーン
Sueyoshiに行きます
セドリックソラウアー
松田明
マーク・スパングラー
ヘンリック・ニー
ヨアン・レクイヤー
ルーカス・アルノー
マーク・ロールフ
インクスタック
ユキノウエ
ブランドンウィーバー
ジョシュ・ニコルズ
リカルド・トリンデード
earlopain
ジェームズ・ブラウン
西山カズヒロ
étienneBarrié
マット・ブラウン
ビクター・マスロフ
Gio Lodi
ライアン・ブルックス
ジェイコブ・フラウツキ
クリスチャン・シュミット
ロドリゴ・アラメド
貢献者の完全なリストについては、貢献者ページにアクセスできます。
偽ヴァブありがとう!このライブラリは、FakeWebに触発されました。そのプロジェクトからWebmockにいくつかのソリューションをインポートしました。また、いくつかのコードIE Net:HTTPアダプターをコピーしました。残念ながら、偽のWEBアーキテクチャは、必要な機能を簡単に拡張することができませんでした。また、私は別の方法で作業することをいくつか好むことを好みました。
Copyright(c)2009-2010 Bartosz Blimke。詳細については、ライセンスを参照してください。