Kanioの日記

ジャンルが定まらず、混沌としています。

Rails Minitest - IT開発備忘録

なぜ人は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