2011-07-07 15 views
4

下のtwitter apiのようなhttp要求をグローバルスコープでスタブするには、Test :: Unitスイートのすべてのテストに有効ですか?Test :: Unitでhttpリクエストをグローバルにスタブするにはどうすればいいですか?

stub_request(:get, "https://api.twitter.com/1/users/show.json?screen_name=digiberber"). 
    with(:headers => {'Accept'=>'application/json', 'User-Agent'=>'Twitter Ruby Gem 1.1.2'}). 
    to_return(:status => 200, :body => "", :headers => {}) 

class MyTest < ActiveSupport::TestCase  
    setup do 
    stub_request(...)... 
    end 
end 

などのTestCaseのサブクラスのセットアップ()ブロック内のこのWebMockスタブ作品、しかし、私はテストケース自体のグローバル設定の中にそれを置く場合は認識されません。

require 'webmock/test_unit' 
class ActiveSupport::TestCase 
    setup do 
    stub_request(...) 
    end 
end 

私にエラーが表示される:

NoMethodError: undefined method `stub_request' for ActiveSupport::TestCase:Class 

また、私は自分自身defで

def self.setup 
    stub_request(...) 
end 

の方法にパッチを当てることで試してみたが、それはどちらか動作しません。

WebMockの代わりにFlexMockを使用すると、同様のことが発生します。スコープに問題があるようですが、どうやって回避するのか分かりません。アイデア?セットアップ(に異なる方法で

+0

、申し訳ありませんがちょうど答えが、あなたがテスト::ユニットを使用していることを逃しました。とにかく、FakeWebを見てみましょう。 https://github.com/chrisk/fakeweb – d11wtq

+0

fakewebには同じ問題はありませんか? register_uri()はwebmockのstub_request()と非常によく似ていますので、それをグローバルに実行する必要があります – oliverbarnes

+0

おそらく、HTTPリクエストをクラスまたはモジュールメソッドに抽象化することができます。 –

答えて

1

This post)とティアダウンは()だけ

class ActiveSupport::TestCase 
    def setup 
    stub_request(...) 
    end 
end 

がインスタンスメソッドとしてそれを宣言する考えていなかったんために私を導きました。 :これで/ test_helper.rb *

require 'fakeweb' 

class ActiveSupport::TestCase 
    def setup 
    # FakeWeb global setup 
    FakeWeb.allow_net_connect = false # force an error if there are a net connection to other than the FakeWeb URIs 
    FakeWeb.register_uri(:get, 
     "https://api.twitter.com/1/users/show.json?screen_name=digiberber", 
     :body => "", 
     :content_type => "application/json") 
    end 
    def teardown 
    FakeWeb.allow_net_connect = true 
    FakeWeb.clean_registry # Clear all registered uris 
    end 
end 

*試験で

は、あなたが任意のテストケースから登録fakewebに呼び出すことができます:P

2

あなたはこのような何かを行うことができFakeWebを使用します。

関連する問題