なぜ人はspecを使うのか。
こういうのは本家のDefaultが正義でしょ、Minitestを使おうぜ。assertとstubとかmockを覚えれば大体いける。
Document
Testing Rails Applications — Ruby on Rails Guides
Assert
ドキュメントを見るのが良い。
よく忘れるのはこれ。Exceptionってどうやって拾うんだっけ、ってなる。
assert_raises( exception1, exception2, ... ) { block }
Log in
Warden::Test::Helpers を include したうえで、login_as を使う。
include Warden::Test::Helpers test "should get new" do @user_01 = users(:user_01) login_as(@user_01, scope: :user) get new_moge_url assert_response :success end
Stub
stub_any_instanceを使って、クラスのインスタンスメソッドを実行したことにする。オブジェクトのメソッドの場合はstubを使う。
stub_any_instanceは外部APIの呼び出し(を書いたクラスの処理)をスキップさせるためによく使う気がする。
test "should get new" do ClassName.stub_any_instance(:method_name, return_value) do assert_difference 'Hoge.count', 1 do patch moge_url(@moge), params: update_params assert_redirected_to moge_path end end end private def return_valuse # 適当なvalue end
Delayed Job
ActiveJob::TestHelplerを使って、perform_enqueued_jobs の間にテスト内容を書く。
test "should get new" do perform_enqueued_jobs do assert_difference 'Moge.count', 1 do patch moge_url(@moge), params: update_params assert_redirected_to moge_path end end end
File Upload
ファイルアップロードのやり方。fixtureにファイルを置いて、それを読み込ませる。
setup do @file = fixture_file_upload('test/storage/file.png') end private def params { hoge: { photo: @file } } end
Task
バッチ処理のテスト。
バッチなので日時を stub することが多いような。Taskコマンドは reenable しないと連続で使えない。
Taskコマンドは非同期処理っぽいので、テスト項目を一括で実行するとちゃんと動かないことがあった(なんでかは調べてない)。
time_zone = Time.zone time_zone.stub(:today, Date.new(2025, 1, 1)) do Rake::Task['hoges:moges'].reenable Rake::Task['hoges:moges'].invoke # テスト end
class_nameとかmogeとかを混在して使ってるのに今更ながら気づいてしまった。
備忘録の一覧はこちら
mokuzukanio.hatenablog.com