新人のRailsエンジニアです。
RailsのTestをするにあたってRSpecを学んだのでまとめてみました。
100日後に1人前になるエンジニアを連載中です。本日は7日目
ちなみにMinitestとRSpecの比較についてはこちら
RSpecとは
RubyやRuby on Railsで作ったクラスやメソッドをテストするためのドメイン特化言語 (DSL)を使ったフレームワーク。
つまりは、テスト専用のプログラム言語とも言えます。
FactoryBot
テスト用のデータの作成をサポートするgem
FactoryBotを利用するとテスト用のデータを簡単に準備できる
Rails標準ではFixtureという仕組みもありますが、
こちらよりもデータの状態やデータ間の関係性を掴みやすい。
ということで今回はこちらも使用。
Capybara
WebアプリケーションのE2E(End-to-End)テスト用フレームワーク。
RSpecなどと組み合わせて使います。Webアプリケーションのブラウザ操作をシュミレーションできる。
RSpecの基本形
RSpecの記述の基本形としては以下の様な形です。
describe[仕様を記述する対象(テスト対象)],type[specの種類]docontext[ある状況]dobeforedo[事前準備]endit[仕様の内容(期待の概要)]do[期待する動作]endendend
これだけみてもなかなかわからないので分割してみていきます。
describe
describe[仕様を記述する対象(テスト対象)],type[specの種類]doend
describeには、何について仕様を記述しようとしているのかを書きます。
例えばsystemテストをプロフィール表示機能について仕様を書きたいのであれば
describe 'プロフィール表示機能', type: :system do
と言った具合ですね。
context
こちらはテストの内容を状況、状態のバリエーションごとに分類するために利用します。
例えばユーザーの入力内容が正しいか間違っているか、ユーザーがログインしているか否かなどを
contextに記述していきます。
before
beforeはその領域全体の前提条件を実現するためのコードを記述している
以下のだとプロフィールを表示するための前提条件。
この場合だとログインしていることが前提条件になっている
context'ユーザーがログインしているとき'dobeforedovisitlogin_pathfill_in'メールアドレス',with: 'email@example.com'fill_in'パスワード',with: 'password'click_button'ログイン'endend
it
最後のitは期待する動作と文章をブロック内のコードで記述します
expect(page).to have_content 'hoge'
上の記述は画面に"hoge"という内容があるよね??
っていう内容になっています。
expect to have contentなので英語のままといえばそれまでですが。
#プロフィール画面に'ユーザーのプロフィール'って内容があるよね??it'ユーザーのプロフィールが表示される'doexpect(page).tohave_content'ユーザーのプロフィール'end
以上まとめてみると
describe'プロフィール表示機能',type: :systemdocontext'ユーザーがログインしているとき'dobeforedovisitlogin_pathfill_in'メールアドレス',with: 'email@example.com'fill_in'パスワード',with: 'password'click_button'ログイン'endit'ユーザーのプロフィールが表示される'doexpect(page).tohave_content'ユーザーのプロフィール'endendend
こう言った形でRSpecの基本形が成り立っています。
いきなり全部理解しようとするとつらいけど、分割してみるとなんとかなりそう。
今回は基本形をどう見るかという点でまとめてみました。
実際はもっとネストがあって、込み入っている様に見えますが、
まずは基本形をおさえてRSpecの理解を深めていきたいですね。
本日は以上です
1人前のエンジニアになるまであと93日