如何在 ruby-on-rails 应用程序上使用 Rack 发送 POST 模拟请求?
Posted
技术标签:
【中文标题】如何在 ruby-on-rails 应用程序上使用 Rack 发送 POST 模拟请求?【英文标题】:How can I send a POST mock request with Rack on a ruby-on-rails application? 【发布时间】:2022-01-20 11:29:59 【问题描述】:我正在测量一个 Rails 博客应用程序的各个方面所花费的时间,生成于:rails new myblog --database=sqlite3
。我没有修改就使用它,并且数据库包含博客文章。到现在为止,我只是在测试特定文章的 GET 请求所花费的时间。我为此使用 Rack 及其 MockRequest,这是我的测试文件的摘录:
app = Rails.application
env = Rack::MockRequest::env_for("http://localhost/blog_posts/25")
resp = app.call(env)
unless resp.first == 200
raise "error with response #resp.first"
end
我意识到像这样使用,我的env_for
调用只执行 GET 请求,我想使用 POST 请求将新的博客文章添加到我的数据库中,但我不知道该怎么做。我得到的最接近的方法是按如下方式修改我的测试脚本,但我总是收到 422 响应(“您想要的更改被拒绝,也许您试图更改您无权访问的内容。”)。
app = Rails.application
env = Rack::MockRequest::env_for("http://localhost/blog_posts", :method => "POST", :params => content: "lorem ipsum body", title: "lorem ipsum title", created_at: DateTime.now(), updated_at: DateTime.now())
resp = app.call(env)
unless resp.first == 200
raise "error with response #resp.first"
end
所以我的问题是:
我可以使用 rack 执行 POST 模拟请求并修改数据库吗? 如果是,我应该在某处更改数据库的权限吗?还是问题出在其他地方? 如果没有,是否有解决方法?这仅用于测试,因此没有安全问题,但我更喜欢继续使用模拟请求,因为它更适合我的测试基础架构。作为附加信息,这是数据库的架构:
create_table "blog_posts", force: :cascade do |t|
t.string "title"
t.text "content"
t.datetime "created_at", precision: 6, null: false
t.datetime "updated_at", precision: 6, null: false
end
【问题讨论】:
【参考方案1】:我的测试脚本有两个错误:
发送的数据格式不正确。应该是:env = Rack::MockRequest::env_for("http://localhost/blog_posts", :method => "POST", :params => post:content: "lorem ipsum body", title: "lorem ipsum title")
添加文章成功返回302
现在工作正常!
【讨论】:
以上是关于如何在 ruby-on-rails 应用程序上使用 Rack 发送 POST 模拟请求?的主要内容,如果未能解决你的问题,请参考以下文章
paypal 与 ruby on rails 集成的“zoid 破坏了所有错误”
为啥 Gibbon Gem 可以访问 API 但不能 listSubscribe()?