【Rails】ControllerTestでdeviseを使ったユーザー毎のデータを取り扱う

Railsで開発しているオリジナルアプリ「渇望記録」(desire-record-open)でテストが全部こけていたので動くように修正したのでメモ。



テストデータ準備

テストデータは{app_dir}/test/fixtures/以下のymlファイルに準備するらしい。

test/fixtures/user.yml

john:
  email: "john@example.com"
  encrypted_password: <%= Devise::Encryptor.digest(User, 'password') %>
  confirmed_at: <%= Time.now - 100 %>

do:
  email: "do@example.com"
  encrypted_password: <%= Devise::Encryptor.digest(User, 'password') %>
  confirmed_at: <%= Time.now - 100 %>

test/fixtures/record.yml

one:
  hour: 2019-05-24 18:03:47
  activity: MyText
  desire_level: 1
  feeling_level: 1
  comment: MyText
  date: 2019-05-24
  email: "john@example.com"

two:
  hour: 2019-05-24 18:03:47
  activity: MyText
  desire_level: 1
  feeling_level: 1
  comment: MyText
  date: 2019-05-24
  email: "do@example.com"

テストコード

+となっているところがドハマりした点。参考にしたQiita記事が少し古かったようだ。

test/controllers/record_controller_test.rb

class RecordsControllerTest < ActionDispatch::IntegrationTest
-  include Devise::Test::ControllerHelpers
+  include Devise::Test::IntegrationHelpers

  setup do
    @record = records(:one)
+   sign_in users(:john) #user.ymlのjohnさんがログインした状態を再現
  end
## 中略
  test "should create record" do
    assert_difference('Record.count') do
      post records_url, params: { record:
        { activity: @record.activity,
          comment: @record.comment,
          date: @record.date,
          desire_level: @record.desire_level,
          feeling_level: @record.feeling_level,
          hour: @record.hour,
+         email: @record.email
          }
        }
    end

    assert_redirected_to show_date_records_path(date: @record[:date])
  end

recordは1時間毎の渇望記録データ。そこにemailがなかったので追加した。

テスト実行

railsのテスト実行は下記。全テスト実行する。
mac上で動かす場合はbundlerを介する必要がある。

$ bundler exec rails test

testはtでも可能。またUbuntuなどのLinux系OSではbundler execが必要ない。

結果

user@userMBA:desire-record-open$ bundle exec rails t
Running via Spring preloader in process 21765
Run options: --seed 42306

# Running:

........

Finished in 3.284288s, 2.4358 runs/s, 3.0448 assertions/s.
8 runs, 10 assertions, 0 failures, 0 errors, 0 skips


参考資料

コメント

タイトルとURLをコピーしました