💎

【RSpec】xdescribe, xcontext, xitを使って、テストを効果的に保留する方法

2024/05/01に公開

はじめに

テスト駆動開発(TDD)を行う上で、未完成の機能や突発的な問題に対処するために、テストを一時的に無効にすることがあります。

この記事ではRSpecを用いて保留中のテストの扱い方について学んだ内容を共有します。

保留テストの利点

保留テストは以下の状況で有効です。

1. 早期のテスト記述:

未実装の機能の動作を明確にするためにテストを書きます。

2. 開発優先順位の変更:

開発の優先順位が変わると、特定のテストを一時的に後回しにすることがあります。

3. 予期せぬ問題の発生時:

ある変更が別のテストを失敗させた場合、そのテストを保留にすると便利です。

RSpecでのテスト保留方法

RSpecでは、以下の方法でテストを保留にできます。

xdescribe # describeブロック全体を保留にします
xcontext  # contextブロック全体を保留にします
xit       # 個別のテストケースを保留にします

https://docs.rubocop.org/rubocop-rspec/cops_rspec.html

https://qiita.com/jnchito/items/42193d066bd61c740612#手っ取り早くexample全体をskipさせる-xit

実践例

以下は、RSpecでこれらの保留メソッドを適用する具体例です。

RSpec.xdescribe UserMailer, type: :mailer do
  describe '#remind_campaign' do
    xit 'HTML形式でキャンペーン名が含まれる' do
      mail = UserMailer.remind_campaign(user, campaign)
      body = mail.body.parts.find { |p| p.content_type.match /html/ }.body
      expect(body.raw_source).to include(campaign.name)
    end

    xcontext 'ユーザーがアクティブな場合' do
      it 'メールを送信する' do
        expect(UserMailer).to receive(:remind_campaign).with(user, campaign)
        UserMailer.remind_campaign(user, campaign).deliver_now
      end
    end
  end
end

こちらのRSpecは、UserMailerクラスのremind_campaignメソッドをテストするためのものです。このメソッドは、キャンペーンのリマインダーをユーザーに送信する役割を持っています。テストケースは、メールがHTML形式で正しくキャンペーン名を含んでいるか、そしてユーザーがアクティブな状態でメールが実際に送信されるかどうかを検証しています。

検証しているテストケース

  • メールがHTML形式で正しくキャンペーン名を含んでいるか
  • ユーザーがアクティブな状態でメールが実際に送信されるか

出力例

UserMailer#remind_campaign
  HTML形式でキャンペーン名が含まれる (PENDING: Temporarily skipped with xit)
  ユーザーがアクティブな場合
    メールを送信する (PENDING: Temporarily skipped with xcontext)

Pending: (Failures listed here are expected and do not affect your suite's status)

  1) UserMailer#remind_campaign HTML形式でキャンペーン名が含まれる
     # Temporarily skipped with xit
     # ./spec/mailers/user_mailer_spec.rb:94

  2) UserMailer#remind_campaign ユーザーがアクティブな場合 メールを送信する
     # Temporarily skipped with xcontext
     # ./spec/mailers/user_mailer_spec.rb:100

Finished in 5.04 seconds (files took 8.05 seconds to load)
14 examples, 0 failures, 2 pending

まとめ

RSpecのxdescribe、xcontext、xitといった機能を利用することにより、開発者はプロジェクトの進行状況に合わせてテストを柔軟に管理することができます。これによって、テスト駆動開発(TDD)をより効果的に推進することが可能となります。

参考

https://docs.rubocop.org/rubocop-rspec/cops_rspec.html

https://qiita.com/jnchito/items/42193d066bd61c740612#手っ取り早くexample全体をskipさせる-xit

https://techtechmedia.com/rspec-pending/

最後に

ここまで読んでいただきありがとうございました!
今回の記事が良かったと思ったらぜひ「いいね」を押していただけると嬉しいです(大変励みになります💪)
noteでも記事を執筆していますので、ぜひチェックしてみてください。

https://note.com/take_lifelog/n/n58df7ce7af6f

👇他にもこのようなことについて記載しているのでぜひチェックしてください!
https://zenn.dev/take_tech/articles/374817f256ec9d

今回もご精読いただきありがとうございました!!!

Discussion