プログラミングマガジン

プログラミングを中心にIT技術をできるだけわかりやすくまとめます。

  • ホーム
  • Ruby on Rails
  • 【Rspec】テストコードの処理の共通化(before、let、shared_exampl…
 
 
     
  • サーバー言語  
    • Python
    • Ruby
    • PHP
    • SQL
  •  
  • インフラ  
       
    • AWS
    •  
    • 基本
    • Git
  • Web
       
    • Web開発
    • JavaScript
    • Vue.js
    • React
  •  
  • 設計  
       
    • 実装設計
    • DB設計
  • 問い合わせ
  

【Rspec】テストコードの処理の共通化(before、let、shared_examples)

12.01

  • miyabisan2
  • コメントを書く

この記事は2分で読めます

beforeブロックを使った共通化

beforeブロックを使うことでdescribeやcontextブロックの内部で各テスト実行前に共通のインスタンス変数をセットアップできます。

1
2
3
4
5
6
7
8
9
10
11
describe [テスト対象],type:[specの種類] do
  context [状態] do
    before do
      [事前準備]
    end
    it [仕様] do
      [期待動作]
    end
  end
end

beforeブロックによる共通化のデメリット

  • beforeブロックではテストを実行するたびに毎回実行されるのでテストに予期しない影響を及ぼす可能性がある。
  • 要件が増えるに連れてテストの可読性が悪くなる。

beforeブロックではテストを実行するたびに毎回実行されるのでテストに予期しない影響を及ぼす可能性がある。

全てのテストが使わない余計なデータを持つことになります。そのため予期しない副作用を起こす可能性があります。

let(共通処理の変数化)

Rspecの共通化は基本的にbefore句にて行うことができるとは思いますが、共通化したい内容が必ずしも固定値じゃ無い場合に使えるのがletで変数的に処理を共通化することができる機能になります。letは遅延読み込み(呼ばれた際に初めてデータを読み込む)であり、beforeブロックの外部で呼ばれるのでセットアップに必要なテスト構造を減らすことが可能です。

letの構文

下記のように記述します。

1
let(:定義名) {定義の内容、つまりRspecで行う処理}

定義名と記述した箇所が実際にRspecのテストコード内で使えるオブジェクトの変数になります。

例

1
let(:user) {FactoryBot.create(:user)}

例えば、上記のようにすることでuserという変数に対してFactoryBotのテンプレートで定義したDBの登録情報を格納することができます。

letが呼ばれるタイミング

letが呼ばれるタイミングはブロック内で初めて変数として呼ばれたタイミングになります。なので、beforeブロックで変数を定義する場合とは異なりインスタンス変数としなくても変数を参照することが可能です。一度も呼ばれないletは実行されることは無いので注意です。例えば、contextブロックの中に記載したletは必ず呼ばれますが、describe直下に配置したletは変数として実際に別のコードで使われルことがない限りは実行されないです。

letは上書きできる。

letで定義した変数は入れ子になっているテストコードの場合はより下の階層で定義したletにて上書きすることが可能です。基本的にはこういう値が良いが、数少ない特定の場合だけは変えたいと言った場合には使える機能です。

let!について

letは変数として別のコードで呼んであげないと使われないですが、let!として定義すればbeforeの前に強制的に実行させることが可能です。要は遅延読み込みを強制的に解除して変数を読み込ませることが可能です。あまり使う機会がないかもしれませんが、既存のテストコードの問題で使わざる追えないケースがあるかもしれませんので知っておくと良いでしょう。

let!の用途

letで定義した変数はそのブロック内で1度でも使わない限りは初期化されることはありません。なので、変数の値としては使わないが変数の件数をカウントしたい場合とかの用途では使うことができます。ただ、beforeブロックと機能は同じですし「!」は小さな変化のため読み間違えてしまいやすいのでもし使う場合はbeforeブロックを使うことも検討しましょう。

shared_context(contextの共通化)

shared_contextを使うと「複数のテストファイルの処理」の共通化を行うことができます。

共通化

1
2
3
RSpec.shared_context "共通化名" do
 処理内容
end

呼び出し側

1
include_context "project setup"

shared_example(itの共通化)

shared_exampleを使うと「it内の処理」の重複を共通化する機能です。

共通化後の書き方

下記のようにitの処理を共通化します。

1
2
3
shared_examples_for '共通処理名' do
  it { 共通処理内容 }
end

呼び出し方

下記のように呼び出します。

1
it_behaves_like '共通処理名'

スポンサーリンク
  • 2019 12.01
  • miyabisan2
  • コメントを書く
  • Rspec, Ruby, Ruby on Rails
  • Tweets Twitter
  • このエントリーをはてなブックマークに追加
  • LINEで送る

関連記事

  1. 2019 12.22

    【Ruby】REPL(IRB、pry)について

  2. 2019 12.17

    【Ruby】データ型クラス

  3. 2018 06.17

    【Ruby on Rails】概要(他言語への影響、環境別構成例、テストフレームワーク)

  4. 2020 07.18

    【Ruby on Rails】「ActionText」のリッチテキストを使う

  5. 2020 03.15

    【Rspec】「FactoryBot」の構文について

  6. 2020 01.10

    【Ruby on Rails】「cancancan」について

  • コメント ( 0 )
  • トラックバック ( 0 )
  1. この記事へのコメントはありません。

  1. この記事へのトラックバックはありません。

返信をキャンセルする。

【Rspec】Capybaraの構文まとめ

【Rspec】itのマッチャの種類(カスタムマッチャ、…

RETURN TOP

著者プロフィール

エンジニア歴10年で過去に業務系、Webデザイン、インフラ系なども経験あります。現在はWeb系でフロントエンド開発中心です。

詳細なプロフィールはこちら

スポンサーリンク

カテゴリー

  • Android
  • AngularJS
  • API
  • AWS
  • C++
  • CSS
  • cursor
  • C言語
  • DDD
  • DevOps
  • Django
  • Docker
  • Figma
  • Git
  • GitLab
  • GraphQL
  • gRPC
  • Hasura
  • Java
  • JavaScript
  • Kubernetes
  • Laravel
  • linux
  • MySQL
  • Next.js
  • nginx
  • Node.js
  • NoSQL
  • Nuxt.js
  • Oracle
  • PHP
  • Python
  • React
  • Redux
  • Rspec
  • Ruby
  • Ruby on Rails
  • Sass
  • Spring Framework
  • SQL
  • TypeScript
  • Unity
  • Vue.js
  • Webサービス開発
  • Webデザイン
  • Web技術
  • インフラ
  • オブジェクト指向
  • システム開発
  • セキュリティ
  • その他
  • データベース
  • デザインパターン
  • テスト
  • ネットワーク
  • プログラミング全般
  • マイクロサービス
  • マイクロソフト系技術
  • マルチメディア
  • リファクタリング
  • 副業
  • 未分類
  • 業務知識
  • 生成AI
  • 設計
  • 関数型言語
RETURN TOP

Copyright ©  プログラミングマガジン | プライバシーポリシー