如何在R中构造HTTP请求用于Plumber API测试?
解决Plumber API测试中调用httr::request_build的问题
嘿,我之前在给Plumber API写单元测试的时候也遇到过这个小麻烦,刚好可以给你分享几个可行的方案:
1. 直接访问httr的内部request_build函数
httr的request_build确实没有对外导出,但我们可以通过三个冒号(:::)来访问它的内部命名空间函数,这在测试场景下完全够用——虽然要注意这是内部函数,未来httr版本更新可能会有变动,但测试用例里暂时没问题。
举个完整的测试例子:
假设你的Plumber API文件api.R是这样的:
#* @get /greet function(req) { list(greeting = paste("Hi there,", req$query$user)) }
那测试代码可以这么写:
library(plumber) library(httr) # 加载你的API pr <- plumb("api.R") # 用httr内部的request_build构造请求对象 req_obj <- httr:::request_build( method = "GET", url = parse_url("http://localhost/greet?user=Sarah"), headers = list(Accept = "application/json") ) # 找到你要测试的端点(这里假设是第一个端点) target_endpoint <- pr$endpoints[[1]] # 把构造好的请求传给端点处理函数,获取响应 result <- target_endpoint$func(req_obj$request) # 验证结果是否符合预期 stopifnot(result$greeting == "Hi there, Sarah")
2. 更轻量的模拟请求方法(可选)
如果不想依赖httr的内部函数,其实可以直接构造Plumber需要的req对象结构,不用绕request_build,这样更稳定:
library(plumber) pr <- plumb("api.R") # 直接模拟Plumber的req对象 mock_req <- list( query = list(user = "Sarah"), method = "GET", headers = list(Accept = "application/json") ) # 调用端点函数验证 result <- pr$endpoints[[1]]$func(mock_req) stopifnot(result$greeting == "Hi there, Sarah")
3. 用Plumber官方推荐的测试工具
如果你想更规范地做API测试,也可以试试Plumber配合testthat的方式,核心思路要么是模拟请求对象做单元测试,要么是启动临时服务器用httr发送真实请求做集成测试——后者会稍微慢一点,但能覆盖更完整的请求流程。
内容的提问来源于stack exchange,提问作者Sarah Messer
相关产品推荐
相关产品推荐

