如何用WebMock存根请求并返回含正则匹配ID的响应?
WebMock存根请求时处理动态数字ID的解决方案
你原来的代码无法运行的核心原因是:JSON不支持序列化正则表达式对象。当你调用{ "data": [{ "id": /\d+/ }] }.to_json时,Ruby会把正则转换成字符串"/\\d+/",WebMock返回的响应体里会是这个字符串,而不是能匹配任意数字的逻辑——这显然不符合你的需求。
根据你的需求(生成唯一ID且无需手动枚举数字组合),以下是两种可行的解决方案:
场景1:匹配任意带数字ID的请求
如果你的需求是让存根匹配URL中包含任意数字ID的请求(比如someurl/123、someurl/4567这类),可以直接用正则匹配请求URL:
# 匹配someurl后接任意数字的URL stub_request(:get, /someurl\/\d+/). with(headers: {'Accept'=>'*/*', 'User-Agent'=>'Ruby'}). to_return(status: 200, body: { "data": [{ "id": SecureRandom.random_number(1_000_000) }] }.to_json)
这里用SecureRandom.random_number生成随机数字作为响应的ID,保证每次返回的ID唯一。
场景2:动态生成唯一响应ID
如果你的需求是每次请求存根时,返回一个唯一的数字ID(不管请求内容是什么),可以用WebMock的块式返回逻辑,动态生成ID:
方式1:递增序列ID(保证连续唯一)
id_counter = 0 stub_request(:get, "someurl"). with(headers: {'Accept'=>'*/*', 'User-Agent'=>'Ruby'}). to_return(status: 200) do |request| id_counter += 1 { body: { "data": [{ "id": id_counter }] }.to_json } end
每次调用存根,ID会自动递增,确保绝对唯一。
方式2:随机唯一数字ID
stub_request(:get, "someurl"). with(headers: {'Accept'=>'*/*', 'User-Agent'=>'Ruby'}). to_return(status: 200) do |request| # 生成一个大的随机唯一数字 unique_id = SecureRandom.uuid.delete('-').to_i(16) { body: { "data": [{ "id": unique_id }] }.to_json } end
利用UUID生成唯一字符串,再转换为数字,适合不需要连续ID的场景。
内容的提问来源于stack exchange,提问作者Tony Beninate
相关产品推荐
相关产品推荐

