PostsEditCapybaraでSinatraアプリをテストする2017-02-28TechこのブログはSinatraで作っていて、テストはRack::Testで書いてたのだけど、思い立ってCapybaraで書き直した。Capybara?というのはある種のバグがRack::Testだと漏れちゃうんですよね。フォームをsubmitしたときにビューのtypoで正しいリクエストが飛ばない、みたいなやつ。Rack::TestだとこういうPOSTリクエストに対しこういう挙動をする、は書けるんだけど、ボタンを押したときにどういうPOSTが飛ぶか、はCapybaraでないと書けない。testを書いて...みたいな構成もあり得るけど、このブログの場合は規模が小さいのでCapybaraによるE2Eテストだけあれば良いかなと思う。以下、Rack::Testから移行するに当たって「これどうするんだろ?」ってなったことをメモしておく。Basic認証したいDriverによって指定方法が違うみたい。Rack::TestドライバはBasic認証に対応してなさそう。ヘッダを直接指定するという方法があった(参考)。endフォームが表示されることを確認したいhave_content("form")...かと思いきや、これはformというテキストが画面に表示されている、という意味なのでタグには反応しない。have_selector("form")が正解。フォームにデフォルトで入力されていることを確認したいこれもhave_selectorでいける。have_selector("input[name='title'][value='#{@valid_posted[:title]}']")POSTしたいpostメソッドがない、と思ったがCapybaraはE2Eテスト用のライブラリなので、POSTリクエストを直接送るような手段はないのだった。その代わりにclick_linkやclick_buttonといったメソッドがあるので、まずvisitで編集画面にアクセスして、フォームに記入してclick_buttonする、みたいな書き方になる。今回はこんな感じにした。"Save"fill_editorはcheckメソッドでチェックボックスをオンにしたり、fill_inでテキストを入力したりする。authorTwitterGitHub。