はじめに
みなさん、テストコードは書かれているでしょうか?
私も極力書くよう心がけているつもりですが、忙しかったり、難易度が高いテストだとすぐにサボってしまいます。
私は主にRSpecを使用していますが、実は便利なメソッドがたくさんあります。
今回は備忘録を兼ねて記事にまとめたいと思います。
参照するRSpecのバージョンは
3.7
です。
その1として連載形式にしたいと思っていますが、いつ「その2」を書くかは未定です(笑)
テストコードの実行をスキップする
大きな変更があり、既存のテストコードが使えなくなる事があると思います。
そんなときにエラーが出っ放しも気持ち悪いので、実行時にスキップさせます。
ファイル単位でスキップさせる場合は、下記の
skip
を使用すると良いと思います。
1 2 3 4 5 6 7 | require 'rails_helper' RSpec.describe User, :type => :model, skip: true do # .... end |
テスト単位でスキップさせるならば、テスト内で
skip
を使用します。
1 2 3 4 5 6 7 8 9 10 11 12 | require 'rails_helper' RSpec.describe User, :type => :model do it '実行するテスト' do # ... end it 'スキップするテスト' do skip # ... end end |
なお、他にもpendingという方法があります。
こちらの記事に記載がありますが、外的要因による一時的なテスト失敗は、
pending
の方が良さそうです。
共通のテストコードを用意する
例えばモデルの
concern
などでモジュールを用意し、それをモデルに
include
する事があります。
モジュールの方でテストしても良いのかもしれませんが、テストを共通化し、それを各モデルのテストに取り込みたいと思います。
そんなときにも便利なメソッドがあります。
まずは共通化したいテストを作成します。
1 2 3 4 5 6 7 | require 'spec_helper' shared_examples_for 'Shared Example Name' do it 'test name' do # .... end end |
それを必要なSpecに取り込みます。
1 2 3 4 5 6 7 8 | 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
の前に
let
や
before
の処理を置いておけばそちらを評価してくれます。
外部APIの返却値をスタブにする
外部APIを使用した処理をテストする場合、返却値をスタブに置き換えた方が良いかと思います。
下記のようなツイッターにツイートするメソッドがあったとして、
(TwitterのAPIについてはちゃんと確認してないのでよしなに解釈してください。。。)
1 2 3 4 5 6 7 | class TwitterApi # ... def self.tweet # ... end end |
Specの方ではあらかじめこのメソッドについてスタブを置きます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 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
を使用します。
さいごに
簡単なTips集ですが、まとめてみました。
また、私も最近知ったのですが、テストレコードなんかを作成するのに最適なFactoryGirlですが、FactoryBotに名前が変わるそうですね。
こちらの記事で経緯が説明されておりました。
thoughtbot/factory_bot
【翻訳】”Factory Girl”が”Factory Bot”に変わった理由(と移行手順)