首页 > 解决方案 > 如何使用 stub_request 模拟对站点的所有请求?

问题描述

我想在我的 rspec 测试中使用 stub_reuest 模拟对给定站点的所有请求……而不仅仅是我今天知道的 URL。特别是,我想引发异常或超时来模拟 REST 服务脱机或损坏。

如何匹配一个站点的所有 URL?如何阻止给定主机的任何 URL?

标签: ruby-on-railsrubyregexrspecmocking

解决方案


用于:any匹配所有方法,使用正则表达式匹配所有 URL:

their_site = 'http://rest.example.com'
stub_request(:any, /#{their_site}.*/ ).to_raise(Errno::ECONNREFUSED)

或者

their_site = 'https://rest.example.com:443/api'
stub_request(:any, %r[#{their_site}.*] ).to_timeout

或者

stub_request(:any, %r[#{their_site}.*] )
  .to_return(status: 500, body: 'Sorry, mate.')

或者

stub_request(:any, %r[#{their_site}.*] )
  .to_return(status: 404)

或者

stub_request(:any, %r[#{their_site}.*] )
  .to_return(status: 200, 'We tried our best.')

如果你想打破所有外部命中,你可以用正则表达式来做到这一点:

stub_request(:any, /.*/ ).to_timeout

推荐阅读