Yanonoblog!

こつこつと

RSpecの構文メモ(let、shared_context)

はじめに

RSpecの基礎に立ち返ります。

let

letRSpecのメソッドで、遅延評価される変数を定義するために使用されます。

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_contextinclude_contextinclude_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です♪

https://runteq.jp/r/ohtFwbjW

こちらのリンクを経由すると1万円引きになります。

RUNTEQを通じて開発学習の末、受託開発企業をご紹介いただき、現在も双方とご縁があります。

もし、興味がありましたらお気軽にコメントか、TwitterのDMでお声掛けください。

https://twitter.com/outputky