web codery

【Rails】モデルをupdateしたらfixtureや変数に反映する

category: Ruby on Rails

Ruby on Railsのテストで、モデルへのupdateをreloadしなければいけない場面についてメモを残します。
記事投稿時のバージョンはRails5です。

テストの中でupdateアクションをリクエストして、fixtureから読み込んだレコードを更新した場合、

def setup
  @params = { user: { name: "foo" } }
end

test "example test" do
  patch user_url(users(:testuser), params: @params)
  assert_equal users(:testuser).name, @params[:user][:name]  # failure
end
# もちろんコントローラ内でレコードを更新している前提
def update
  @user.update_attributes(params.require(:user).permit(:name))

updateした後に持ってきてもfixtureからは更新前のものが返ってくるようです。

この場合、

......
assert_equal users(:testuser).reload.name, @params[:user][:name]

reloadメソッドを呼び出すと更新が反映されます。読み込むときはfixtureに書いた値、reloadすると更新した内容が反映されるという挙動のようです。

下記のような失敗もあるので、ややこしい場合はreloadメソッドをはさむ癖をつけておくと間違いないのかなと思いました。

def setup
  @user = users(:testuser)
  @params = { user: { name: "foo" } }
end

test "example test" do
  patch user_url(@user, params: @params)
  assert_equal @user.name, @params[:user][:name]  # リロードを忘れてfailure
end

管理人にメッセージを送る





ページトップ