如何在全局范围内将http请求(如下所示)存根到下面的twitter api中,以便它对Test :: Unit套件中的所有测试都有效?
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 => {})
此WebMock存根在TestCase子类的setup()块中工作,如
class MyTest < ActiveSupport::TestCase
setup do
stub_request(...)...
end
end
但如果我将它放在TestCase本身的全局设置中,则无法识别:
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
但它也不起作用。
当我使用FlexMock而不是WebMock时会发生类似的事情。似乎是一个范围问题,但我无法弄清楚如何解决它。想法?
答案 0 :(得分:2)
使用FakeWeb你可以这样做:
在* test / 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。
答案 1 :(得分:1)
This post让我只做了
class ActiveSupport::TestCase
def setup
stub_request(...)
end
end
没想过将它声明为实例方法。 :P
答案 2 :(得分:0)
水豚驱动程序Akephalos确实支持存根http呼叫。他们称之为过滤器。