繁体   English   中英

如何在 ruby-on-rails 应用程序上使用 Rack 发送 POST 模拟请求?

[英]How can I send a POST mock request with Rack on a ruby-on-rails application?

我正在测量在rails new myblog --database=sqlite3生成的 Rails 博客应用程序的各个方面所花费的时间。 我在没有修改的情况下使用它,并且数据库包含博客文章。 到现在为止,我只是在测试特定文章的 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

所以我的问题是:

  • 我可以使用机架进行 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

我的测试脚本中有两个错误:

  • 发送的数据格式不正确。 它应该是:
env = Rack::MockRequest::env_for("http://localhost/blog_posts", :method => "POST", :params => {post:{content: "lorem ipsum body", title: "lorem ipsum title"}})
  • 成功添加文章的响应是 302

现在工作正常!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM