カテゴリー: BackEnd

RSpecの個人的Tips集〜その1〜

はじめに

みなさん、テストコードは書かれているでしょうか?
私も極力書くよう心がけているつもりですが、忙しかったり、難易度が高いテストだとすぐにサボってしまいます。

私は主にRSpecを使用していますが、実は便利なメソッドがたくさんあります。
今回は備忘録を兼ねて記事にまとめたいと思います。
参照するRSpecのバージョンは3.7です。

その1として連載形式にしたいと思っていますが、いつ「その2」を書くかは未定です(笑)

テストコードの実行をスキップする

大きな変更があり、既存のテストコードが使えなくなる事があると思います。
そんなときにエラーが出っ放しも気持ち悪いので、実行時にスキップさせます。
ファイル単位でスキップさせる場合は、下記のskipを使用すると良いと思います。

Skip examples

require 'rails_helper'

RSpec.describe User, :type => :model, skip: true do

  # ....

end

テスト単位でスキップさせるならば、テスト内でskipを使用します。

require 'rails_helper'

RSpec.describe User, :type => :model do
  it '実行するテスト' do
    # ...
  end

  it 'スキップするテスト' do
    skip
    # ...
  end
end

なお、他にもpendingという方法があります。
こちらの記事に記載がありますが、外的要因による一時的なテスト失敗は、pendingの方が良さそうです。

共通のテストコードを用意する

例えばモデルのconcernなどでモジュールを用意し、それをモデルにincludeする事があります。
モジュールの方でテストしても良いのかもしれませんが、テストを共通化し、それを各モデルのテストに取り込みたいと思います。
そんなときにも便利なメソッドがあります。

Shared examples

まずは共通化したいテストを作成します。

require 'spec_helper'

shared_examples_for 'Shared Example Name' do
  it 'test name' do
    # ....
  end
end

それを必要なSpecに取り込みます。

require 'rails_helper'
require Rails.root.join('spec/path/to/shared_examples_spec.rb')

RSpec.describe User, type: :model do
  describe 'Shared Examples' do
    it_should_behave_like 'Shared Example Name'
  end
end

なお、it_should_behave_likeの前にletbeforeの処理を置いておけばそちらを評価してくれます。

外部APIの返却値をスタブにする

外部APIを使用した処理をテストする場合、返却値をスタブに置き換えた方が良いかと思います。

下記のようなツイッターにツイートするメソッドがあったとして、
(TwitterのAPIについてはちゃんと確認してないのでよしなに解釈してください。。。)

class TwitterApi
  # ...

  def self.tweet
    # ...
  end
end

Specの方ではあらかじめこのメソッドについてスタブを置きます。

require 'rails_helper'

RSpec.describe TwitterApi, type: :request do
  describe '#tweet' do
    before do
      allow(TwitterApi).to receive(:tweet).and_return({ 'message' => 'success' })
    end

    it 'can get response' do
      result = TwitterApi.tweet
      expect(result['message']).to eq 'success'
    end
  end
end

クラスメソッドの場合は、allowで良いですが、インスタンスメソッドの場合はallow_any_instance_ofを使用します。

RSpec Mocks 3.7

さいごに

簡単なTips集ですが、まとめてみました。
また、私も最近知ったのですが、テストレコードなんかを作成するのに最適なFactoryGirlですが、FactoryBotに名前が変わるそうですね。
こちらの記事で経緯が説明されておりました。

thoughtbot/factory_bot
【翻訳】”Factory Girl”が”Factory Bot”に変わった理由(と移行手順)

naoki85

シェア
執筆者:
naoki85
タグ: Ruby

最近の投稿

フロントエンドで動画デコレーション&レンダリング

はじめに 今回は、以下のように…

2週間 前

Goのクエリビルダー goqu を使ってみる

はじめに 最近携わっているとあ…

4週間 前

【Xcode15】プライバシーマニフェスト対応に備えて

はじめに こんにちは、suzu…

2か月 前

FSMを使った状態管理をGoで実装する

はじめに 一般的なアプリケーシ…

3か月 前