跳到目录

起重机检查 项目状态:活动-项目已达到稳定、可用状态,正在积极开发中。 R-CMD检查 编解码器 rstudio镜像下载 起重机版本

R库用于存根和设置HTTP请求的期望值。

Ruby宝石的端口网络模拟

详细工作原理

非常简短的版本是:网络模拟程序帮助您存根HTTP请求,这样您就不必重复。

更多详细信息

你告诉我网络模拟程序您想要匹配的HTTP请求,如果它看到一个与您的条件匹配的请求,它实际上并不执行HTTP请求。相反,它会返回与您通过实际请求返回的对象相同的对象,但只返回它所知道的位。例如,由于没有执行请求,我们无法返回您从实际HTTP请求中获得的实际数据。

此外,如果你对网络模拟程序应该返回,我们返回。例如,如果您期望一个请求返回418错误(我是茶壶),那么这就是您得到的结果。

你能与之匹敌的是什么

  • HTTP方法(必需)

加上以下任何单一或组合:

  • URI(URI)
    • 现在,我们可以直接与URI和正则表达式URI模式进行匹配。最终,我们将支持RFC 6570 URI模板。
    • 我们规范化URI路径,以便URL编码的内容与URL未编码的内容(例如你好,世界你好%20world)
  • 查询参数
    • 我们规范化查询参数值,以便URL编码的内容与URL未编码的内容(例如message=你好世界消息=hello%20world)
  • 请求头
    • 我们将标头规范化,并将相同标头的所有形式视为相等。例如,以下两组标题是相等的:
      • 列表(H1=“value1”,content_length=123,X_CuStOm_hEAder=“foo”)
      • 列表(h1=“value1”,“Content-Length”=123,“x-cuSTOM-HeAder”=“foo”)
  • 请求正文

实际HTTP请求

使用时需要考虑几个场景网络模拟程序:

完成后

图书馆(网络模拟程序)

网络模拟程序已加载但未打开。此时网络模拟程序不会改变任何事情。

一旦你打开网络模拟程序喜欢

网络模拟程序::使可能()

网络模拟程序默认情况下,现在不允许从加载适配器的HTTP库发出真正的HTTP请求(仅现在原油).

您可以选择通过webmockr_allow_net_connect(),不允许通过webmockr_disable_net_connect()。您可以检查是否允许使用webmockr_net_connect_allowed().

允许某些类型的真实HTTP请求:我们还不支持这种请求,但您可以使用allow_localhost(允许本地主机)中的参数webmockr_configure()功能。

存储实际HTTP响应

网络模拟程序不这么做。结账录像机

特征

  • 在低HTTP客户端库级别上暂存HTTP请求
  • 设置和验证对HTTP请求的期望
  • 基于方法、URI、标头和正文匹配请求
  • 支持测试那个通过录像机
  • 可用于测试或测试上下文之外

支持的HTTP库

安装

从起重机

安装.包(“网络模拟程序”)

开发人员版本

遥控器::安装_工具(“ropensci/webmockr”)

启用网络模拟

网络模拟程序::使可能()
#>CrulAdapter已启用!
#>HttrAdapter已启用!

测试框架内部

图书馆(原油)
图书馆(测试那个)

#做一个树桩
stub_request(存根请求)(“获得”,"https://httpbin.org/get") %>%
   返回(_R)(身体= “成功!”,状态= 200)
#><webmockr存根>
#>方法:get
#>uri:https://httpbin.org/get
#>具有:
#>查询:
#>主体:
#>请求标头(_H):
#>返回(_R):
#>-状态:200
#>身体:成功!
#>响应标题(_headers):
#>应该超时:FALSE
#>应该提升:错误

#检查它是否在存根注册表中
存根注册表()
#><webmockr存根注册表>
#>已注册存根
#>获得:https://httpbin.org/get|to_return:身体“成功!”状态为200

#提出请求
z(z) <- 原油::Http客户端$新的(网址= "https://httpbin.org")$得到(“获得”)

#运行测试(未返回任何内容表示已通过)
预期_is(z(z),“HttpResponse”)
预期相等(_E)(z(z)$状态代码,200)
预期相等(_E)(z(z)$解析(“UTF-8”),“成功!”)

测试框架外部

仅基于uri并具有默认响应的Stubed请求

stub请求(“获得”,"https://httpbin.org/get")
#><webmockr存根>
#>方法:get
#>uri:https://httpbin.org/get
#>具有:
#>查询:
#>主体:
#>请求标头(_H):
#>返回(_R):
x个 <- Http客户端$新的(网址= "https://httpbin.org")
x个$得到(“获取”)
#><严重反应>
#>网址:https://httpbin.org/get
#>请求标头(_H):
#>用户代理:libcurl/7.79.1 r-curl/5.0.0 crul/1.3
#>接受编码:gzip,deflate
#>接受:application/json、text/xml、application.xml、*/*
#>响应标题(_headers):
#>状态:200

设置返回对象

stub_request(存根请求)(“获得”,"https://httpbin.org/get") %>%
  宽度(_T)(
查询= 列表(你好= “世界”)) %>%
    转向(_R)(地位= 418)
#><webmockr存根>
#>方法:get
#>uri:https://httpbin.org/get
#>具有:
#>查询:hello=world
#>主体:
#>请求标头(_H):
#>返回(_R):
#>-状态:418
#>主体:
#>响应标题(_headers):
#>should_timeout:假
#>应该提升:错误
x个$得到(“获取”,查询= 列表(你好= “世界”))
#><严重反应>
#>网址:https://httpbin.org/get
#>请求标头(_H):
#>用户代理:libcurl/7.79.1 r-curl/5.0.0 crul/1.3
#>接受编码:gzip,deflate
#>接受:application/json、text/xml、application.xml、*/*
#>响应标题(_headers):
#>状态:418

基于方法、uri和查询参数的Stubing请求

stub_request(存根请求)(“获得”,"https://httpbin.org/get") %>%
  宽度(_T)(查询= 列表(你好= “世界”),
标题= 列表('用户代理' = 'libcurl/7.51.0 r-curl/2.6 crul/0.3.6',
                       '接受编码' = “gzip,deflate”))
#><webmockr存根>
#>方法:get
#>uri:https://httpbin.org/get
#>具有:
#>查询:hello=world
#>主体:
#>request_headers:User-Agent=libcurl/7.51.0 r-cur。。。,接受编码=gzip,deflate
#>返回(_R):
存根注册表()
#><webmockr存根注册表>
#>已注册存根
#>获得:https://httpbin.org/get
#>获得:https://httpbin.org/get?hello=world|to_return:状态418
#>获得:https://httpbin.org/get?hello=world带有标题{“User-Agent”:“libcurl/7.51.0 r-curl/2.6 crul/0.3.6”,“Accept-Encoding”:“gzip,deflate”}
x个 <- Http客户端$新的(网址= "https://httpbin.org")
x个$得到(“获取”,查询= 列表(你好= “世界”))
#><严重反应>
#>网址:https://httpbin.org/get
#>请求标头(_H):
#>用户代理:libcurl/7.79.1 r-curl/5.0.0 crul/1.3
#>接受编码:gzip,deflate
#>接受:application/json、text/xml、application.xml、*/*
#>响应标题(_headers):
#>状态:418

暂存请求并设置超时期望

stub_request(存根请求)(“发布”,"https://httpbin.org/帖子") %>% to_timeout(超时)()
#><webmockr存根>
#>方法:后期
#>uri:https://httpbin.org/帖子
#>具有:
#>查询:
#>主体:
#>请求标头(_H):
#>返回(_R):
#>-状态:
#>主体:
#>响应标题(_headers):
#>应该超时:真
#>应该提升:错误
x个 <- Http客户端$新的(网址= "https://httpbin.org")
x个$邮递(“发布”)
#>错误:请求超时(HTTP 408)。
#>-客户端在服务器准备等待的时间内未生成请求。客户可以在以后任何时候重复请求而不进行修改。

Stubing请求并设置HTTP错误预期

图书馆(失礼)
stub_request(存根请求)(“获得”,"https://httpbin.org/get?a=b") %>% 提升(_R)(HTTPBad请求)
#><webmockr存根>
#>方法:获取
#>uri:https://httpbin.org/get?a=b
#>具有:
#>查询:
#>主体:
#>请求标头(_H):
#>返回(_R):
#>-状态:
#>主体:
#>响应标题(_headers):
#>should_timeout:假
#>应提出:HTTPBad请求
x个 <- Http客户端$新的(网址= "网址:https://httpbin.org")
x个$得到(“获取”,查询= 列表(= “b”))
#>错误:错误的请求(HTTP 400)。
#>-由于语法错误,服务器无法理解请求。客户不应在没有修改的情况下重复请求。

高温气冷堆集成

图书馆(网络模拟程序)
图书馆(高温气冷堆)
#>
#>附加包:“httr”
#>以下对象已从“package:crul”中屏蔽:
#>
#>手柄

#打开httr模拟
httr_锁定()
#找不到存根
GET(获取)("https://httpbin.org/get")
#>错误:已禁用真实HTTP连接。
#>未注册的请求:
#>GET(获取)https://httpbin.org/get带有标题{Accept:application/json、text/xml、application.xml、*/*}
#>
#>您可以使用以下代码段存根此请求:
#>
#>stub_request('get',uri='https://httpbin.org/get') %>%
#>宽度(_T)(
#>headers=list('Accept'='application/json,text/xml,application.xml,*/*')
#>      )
#> ============================================================

做一个树桩

stub_request(存根请求)(“获取”,uri= 'https://httpbin.org/get') %>%
  宽度(_T)(
标题= 列表(“接受” = '应用程序/json,文本/xml,应用程序/xml,*/*')
  ) %>%
  返回(_R)(地位= 418,车身= “我是茶壶!!!”,标题= 列表(国际货币联盟= “茶壶”))
#><webmockr存根>
#>方法:get
#>uri:https://httpbin.org/get
#>具有:
#>查询:
#>主体:
#>request_headers:Accept=application/json,te。。。
#>返回(_R):
#>-状态:418
#>身体:我是茶壶!!!
#>response_headers:im_a=茶壶
#>should_timeout:假
#>应该提升:错误

现在返回模拟响应

(物件 <- GET(获取)("https://httpbin.org/get"))
物件$状态代码
#> [1] 418
物件$标题
#>$im_a美元
#>[1]“茶壶”

写入磁盘

在模拟请求之前写入文件

##制作临时文件
如果 <- 临时文件(文件文本= “.json”)
##向文件中写入内容
(“{\”hello\“:\”world\“}\n”,文件= 如果)
读行(如果)
#>[1]“{\”hello\“:\”world\“}”
##制作存根
看不见的(stub_request(存根请求)(“获得”,"https://httpbin.org/get") %>% 
  返回(_R)(身体= 文件(如果)))
##提出请求
外面的 <- Http客户端$新的("https://httpbin.org/get")$得到(磁盘= 如果)
读行(文件(如果))
#>[1]“{\”hello\“:\”world\“}”

或者-您可以使用模拟文件()拥有网络模拟程序处理文件和内容

 <- 临时文件(文件文本= “.json”)
##制作存根
看不见的(stub_request(存根请求)(“获得”,"https://httpbin.org/get") %>% 
  返回(_R)(身体= 模拟文件(_F)(,“{\”hello\“:\”mars\“}\n”)))
##提出请求
外面的 <- 原油::Http客户端$新的("https://httpbin.org/get")$得到(磁盘= )
读行(外面的$内容)
#>[1]“{\”hello\“:\”world\“}”

两者都支持写入磁盘原油高温气冷堆

连续多次请求

例如,多次重定向,然后是最终成功的请求

网络模拟程序::使可能()
图书馆(原油)
图书馆(失礼)

z(z) <- stub_request(存根请求)(“获得”,"https://httpbin.org/get")
返回(_R)(z(z),状态= 200,车身= “foobar”,标题= 列表(= 5))
返回(_R)(z(z),状态= 200,车身= “熊”,标题= 列表(b条= 6))
提升(_R)(z(z),HTTPBad请求)
z(z)

反对的论点 <- 原油::Http客户端$新的(网址= "网址:https://httpbin.org")
#第一个返回()
第一 <- 反对的论点$得到(“获得”)
第一
第一$解析(“UTF-8”)
#第二个返回()
第二 <- 反对的论点$得到(“获得”)
第二
第二$解析(“UTF-8”)
#第三个to_return()-按规定失败
第三的 <- 反对的论点$得到(“获得”)

请注意,后续请求超过了给定的响应数返回()/等。只给出您指定的最后一个响应。尽管如果您设置to_timeout(超时)提升(_R)失败后,此功能不会发生。

  • 拜托报告任何问题或错误.
  • 许可证:麻省理工学院
  • 获取的引文信息网络模拟程序在R操作中引文(package='webmockr')
  • 请注意,此软件包随贡献者行为准则。通过参与此项目,您同意遵守其条款。