RailsのMiniTestでMockやStubを利用する方法

RailsのMiniTestでMockやStubを利用する方法

Railsで開発をしている皆さん、こんにちは!!

今までJavaで開発を行ってきたのですが転職を機にRubyやPHPを使うことになったのでRailsでの単体テストで使用されるMiniTestでモックやスタブを使用する方法について書きたいと思います。

Javaで開発をしていた時はJUnitというもので単体テストのモックをしていたのですがMiniTestにもあるだろうということで探したらあったので書き残します。

MiniTestってなんぞや?

MiniTestとは

では簡単なMiniTestの使用方法から書き残します。

MiniTestの基本的な使い方

test "test case 001" do
  assert_equal '期待値', 'テスト対象の値'
end

の様にしてテストを行います。

テスト対象の値の部分にテスト対象のメソッドの値や、メソッドの戻り値のデータなどを入れてテストを行います。

例では、assert_equalを使用していますが、これは引数に与えられた値の同一性を検証するテストです。

他にも下記の様なものがあります!

アサーション内容
assert引数に与えられた値がtrueのとき成功
assert_empty引数に与えられた値がからのとき成功
assert_raise引数に与えられたエラークラスが発生した場合に成功

基本的なテストならこれくらいで書くことができるでしょう。

他にもたくさんあるようなので適宜、調べて使用してみてください!

Mockとはなんぞや?

ではMockを使用した簡単な例を見てみましょう!

MiniTest::Mockの使用方法

まず、モックを使用するには外部ファイルを読み込まなくてはいけませんのでファイルの先頭の方に

require 'minitest/autorun'

を追加しましょう。

これを追加することでモックを使用することができるようになります。

下の例ではConstクラスに定義されたVARという定数をモック化して書き換える処理を例として挙げます。

class Const
  VAR = 'before'
end
test "test case 002" do
  mock = MiniTest::Mock.new
  mock.expect :call, "モックを使用した後に使用したい値", []
  Const.stub :VAR, mock do
    # この範囲内なら定数VARの値は「モックを使用した後に使用したい値」に変更される。
  end
end

の様に使用します。

単体テストなどでカバレッジを取りたい時などに使用できるかと思います!!

また、

test "test case 003" do
  Const.stub :VAR, "モックを使用した後に使用したい値" do
    # この範囲内では定数VARは「モックを使用した後に使用したい値」と設定されている。
  end
end

このように使用することもできます。

詳しくは公式のドキュメントを参照してください。