webmock解决测试外部链接问题

前段时间测试api的时候,遇到个问题,有的api内部是需要访问外部的api。但是测试环境下得数据都是假的,所以访问外部的api,得到的返回结果都是不对的,所以我需要一个假的外部api的返回值。

网上google了一下,找到了一个gem, webmock,很强大的,可以自己定制的http返回

例子:

1
stub_request(:get, ‘www.geekpark.net’).return (body: ‘abcdefg’, status: 200)

就可以直接阻止去www.gekpark.net的get请求,并返回’abcdefg’

1
Net::HTTP.get(‘www.geekpark.net’, ‘/‘)   # “abcdefg\n”

我使用的是rspec测试,所以我的解决办法就
在spec_helper.rb中

1
2
3
4
5
6
config.before(:each) do
stub_request(:any, 'http://www.geekpark.net/api/user').to_return do |request|
hi = "what you want"
{ body: hi, status: 200 }
end
end

这样在我的每个测试之前就能运行 stub_request ,在这里的to_return的代码块中的request就是被拦截下的http请求。你可以获取request中不同的值来返回不同的结果。

更详细的用法,请看https://github.com/bblimke/webmock

还有一个要注意,在gemfile中这个gem放在了哪个环境的group中后就会将当前环境外部请求阻止掉,所以在test中使用就只放到test 的group下就好了。