因为我们的接口中调用了第三方 API,最近在编写测试时遇到一些问题:
直到发现 rest-client 里用到了Webmock
首先在 Gemfile 中加入:
# Gemfile
group :test do
gem 'webmock'
end
我开始时犯了一个错误,这么写:
# Gemfile
group :test, :development do
gem 'rspec-rails'
gem 'factory_girl_rails'
gem 'simplecov'
gem 'webmock'
end
结果导致在开发环境下,API 调用都不能用了:
WebMock::NetConnectNotAllowedError - Real HTTP connections are disabled. Unregistered request:
接着在 spec_helper.rb 里加入:
# spec/spec_helper.rb
require 'webmock/rspec'
WebMock.disable_net_connect!(allow_localhost: true)
现在可以按 API 文档的输入输出伪造一些 URL 了:
before(:each) do
@valid_token = "blablabla"
@valid_id = "blabla"
stub_request(:post, "http://api.example.com/api/auth")
.with(body: { token: @valid_token })
.to_return(status: 201, body: { id: @valid_id, token: @valid_token }.to_json)
@invalid_token = "invalidblablabla"
stub_request(:post, "http://api.example.com/api/auth")
.with(body: { token: @invalid_token })
.to_return(status: 401)
end
但是这样写,在每个调用了第三方 API 的测试里,开头都得定义一堆这样的东西,乱乱的。又发现一个好东西 VCR
这东西有个最大的好处就是可以让我们按第三方 API 文档的说明,集中的定义好所有伪造 URL
首先在 spec_helper.rb 里加入:
# spec/spec_helper.rb
RSpec.configure do |config|
config.before(:each) do
stub_request(:any, /api.example.com/).to_rack(BlaApi)
end
end
然后在 spec/support/下创建一个:
# spec/support/bla_api.rb
class BlaApi < Grape::API # 我们用的Grape
prefix :api
format :json
namespace :auth do
post do
case params[:token]
when "blablabla" # valid token
{ id: "blabla", token: "blablabla" }
when "invalidblablabla" # invalid token
error!({ "error" => "bla bla bla" }, 401)
else
error!({ "error" => "bla bla bla" }, 401)
end
end
end
end
现在就可以按照 API 文档尽情伪造 URL 了
还有一些想法,没有实现,有兴趣的大虾们可以就此展开