「逆引きCapybara大辞典」補完計画:001 POSTリクエストする

3 minute read

1日に1回はアクセスしているんじゃないかってくらい 使えるRSpec入門・その4「どんなブラウザ操作も自由自在!逆引きCapybara大辞典」 には大変お世話になっています。これはすごいドキュメントです。永久保存版です。本当に感謝です。

このドキュメントには、 Rails でシステムテスト(feature spec)を書くときに「あれ?こんなことがしたいけど、どうすればいいんだっけ???」というときの答えが書いてあります。60個以上あります。すごいです。ほとんどのことがこのドキュメントを読めばわかります。

ただ、それでもわかんないことがあるんですよね。システムテストって、だいたい複雑でシステムによってやりたいことが違うんですよね。だから、60個じゃあ、まだまだ足りません。

ということで、私がシステムテストを実装するときに見つけた問題とその回答をこのブログに随時挙げていこうと思います。「逆引きCapybara大辞典」を勝手に補完して、より良いものにしていこう、というシリーズものです。

今回はその1回目ってことで、システムテストからPOSTする方法について書きます。

Google広告


逆引きCapybara大辞典」補完計画:001 POSTリクエストする

visitメソッドであるURLにアクセスすることができます。

visit new_content_path

このときの HTTP メソッドはGETです。RailsのControllerのアクションだと index, new, show ですね。

では、Railsのcreateにあたる POST はどうすればいいのでしょうか?

visit contents_path, method: :post # !? こんなことはできません!

残念ながら Capybara には、POST するためのメソッドは用意されていません。
そのため、 POST する場合は Net::HTTP を使います。ただし、適切な current_url が設定されていることを前提としていますので、事前に visit root_path などでウェブページを表示しておく必要があります。

uri = URI.parse(current_url)
uri.path = contents_path
res = Net::HTTP.post_form(uri, param1: 'param1の値', param2: 'param2の値')
expect(res).to be_a(Net::HTTPSuccess)

メソッドにしてもいいでしょう。

def post(path, **params)
  uri = URI.parse(current_url)
  uri.path = path
  res = Net::HTTP.post_form(uri, **params)
  expect(res).to be_a(Net::HTTPSuccess)
end

これは以下のように使います。

post cotents_path, param1: 'param1の値', param2: 'param2の値'