RSpecの構文メモ(let、shared_context)
はじめに
RSpecの基礎に立ち返ります。
let
let
はRSpecのメソッドで、遅延評価される変数を定義するために使用されます。
RSpec.describe User, type: :model do let(:user) { create(:user) } it 'is valid with valid attributes' do expect(user).to be_valid end ...
let
メソッドは引数としてシンボルを取り、ローカル変数の定義を行います。値はcreate(:user)
の結果(つまり、新しく作成されたユーザー)を持ちます。
letは遅延評価
let
で定義された変数は「遅延評価」されます。
したがって変数が初めて呼び出されるまでその値は計算されません。
全てのテストで必要でない変数を生成するコストを避けることで、テストコードのパフォーマンスを向上させることができます。
let
で定義された変数は各テストケースごとにリセットされます。これにより、テストケース間でのデータの汚染を防ぐことができます。
shared_context
複数のテストケースで共有する前提条件やヘルパーメソッドを定義するための機能です。
例えば、複数のテストケースで同じようなセットアップ(データの準備やログイン処理など)が必要な場合、そのセットアップをshared_context
内に定義しておき、必要なテストケースでそのshared_context
をinclude_context
やinclude_examples
で読み込むことで、コードの重複を避けることができます。
# spec/support/shared_contexts.rb RSpec.shared_context 'logged in user' do let(:user) { create(:user) } before do sign_in user end end # spec/controllers/some_controller_spec.rb RSpec.describe SomeController, type: :controller do include_context 'logged in user' # ここから下でテストを書くと、全てのテストケースでログインユーザーが利用可能になる end
このように、shared_context
を使うことでテストコードのDRY(Don't Repeat Yourself)を保つことができ、テストコードの管理が容易になります。
おしまい
コメント
本記事の内容は以上になります!
プログラミングスクールのご紹介 (卒業生より)
お世話になったプログラミングスクールであるRUNTEQです♪
こちらのリンクを経由すると1万円引きになります。
RUNTEQを通じて開発学習の末、受託開発企業をご紹介いただき、現在も双方とご縁があります。
もし、興味がありましたらお気軽にコメントか、TwitterのDMでお声掛けください。