RailsのMiniTestでMockやStubを利用する方法
- #Rails
 - #Testing
 - #TDD
 - #Ruby
 
- 2018/12/29
 
RailsのMiniTestでMockやStubを利用する方法
Railsで開発をしている皆さん、こんにちは!!
今までJavaで開発を行ってきたのですが転職を機にRubyやPHPを使うことになったのでRailsでの単体テストで使用されるMiniTestでモックやスタブを使用する方法について書きたいと思います。
Javaで開発をしていた時はJUnitというもので単体テストのモックをしていたのですがMiniTestにもあるだろうということで探したらあったので書き残します。
MiniTestってなんぞや?
MiniTestとは
- Railsで標準で使用することのできるテスティングフレームワーク
 - 巷でデファクトスタンダード?となっているかもしれないRSpecよりも軽いらしい
 - 単体テストで使用されるもの。
 
では簡単なMiniTestの使用方法から書き残します。
MiniTestの基本的な使い方
test "test case 001" do
  assert_equal '期待値', 'テスト対象の値'
end
の様にしてテストを行います。
テスト対象の値の部分にテスト対象のメソッドの値や、メソッドの戻り値のデータなどを入れてテストを行います。
例では、assert_equalを使用していますが、これは引数に与えられた値の同一性を検証するテストです。
他にも下記の様なものがあります!
| アサーション | 内容 | 
|---|---|
| assert | 引数に与えられた値がtrueのとき成功 | 
| assert_empty | 引数に与えられた値がからのとき成功 | 
| assert_raise | 引数に与えられたエラークラスが発生した場合に成功 | 
基本的なテストならこれくらいで書くことができるでしょう。
他にもたくさんあるようなので適宜、調べて使用してみてください!
Mockとはなんぞや?
- 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
このように使用することもできます。
詳しくは公式のドキュメントを参照してください。
 Share: 
X (Twitter)