ja ja ja ja en ja ja en ja ja ja ja ja ja ja ja ja en ja ja en en ja ja ja en ja ja ja ja ja ja en nl ja de ja ja de ja ja de ja ja sv ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja en ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja
n_plus_one_controlはrequest specで使うのが良いという話とrequest specでログイン後のリクエストを投げるための方法について - おもしろwebサービス開発日記チラシの裏
N+1が起きるのは実際のユーザがアクセスしたときなので、システムスペックでは、と思いそうしていた
しかしsystem specだと、ajaxを利用しているページを表示したときにタイミング次第でajaxリクエスト処理時のSQLを計算に入れてしまいテストがコケる
具体的にはturbo-frameで遅延ロードを追加ところこれが発覚したけど、turbo-frameに限らずajax使っているページでは起こり得る
他になんかいい方法あるかな、と考えたがN+1をチェックするところはrequire specを使うのがいいんじゃないか、という結論に達した
request specでログイン後のリクエストを投げる
↑ということでrequest specを久しぶりにちゃんと書こうと思ったらログインどうやるんだっけ?となったのでまとめた
1. allow_any_instance_of
手っ取り早いがハック感ある
before do allow_any_instance_of(ApplicationController).to receive(:current_user).and_return(ログインさせたいユーザオブジェクト) end
get root_path session[:user_id] = user.id get after_login_path
これはうまく動かなかった
最初にroot_pathにアクセスしているのは、sessionメソッドが@requestが存在している前提で書かれており、最低一度アクセスしないといけないため
昔はこれで実装していたような記憶がうっすらあるが、Rails5からはできなくなったのかも
rails5 can't access session in ActionDispatch::IntegrationTest · Issue #23386 · rails/rails
↑にある再現コードでsessionが入らないことを確認したのでもうできない、という認識で良さそう
3. ログイン用のリクエストを事前に投げる
request specもE2Eの一種と考えると、ちゃんとログイン用のリクエストを投げるのがお行儀が良いのでは、という気がする
dhhも推奨している方式
これはOmniAuthでtwitterログインしている前提
OmniAuth.config.test_mode = true OmniAuth.config.mock_auth[:twitter] = OmniAuth::AuthHash.new( provider: 'twitter', uid: idをいれる, info: { nickname: ユーザ名をいれる } ) post '/auth/twitter' follow_redirect! # OmniAuthはリダイレクト後にログインセッションを生成しているのでこれがないとログインできない
willnet 2021-07-05 19:11
Railsのbelongs_toによるバリデーションと外部キー制約って重複しているような気がする
表題のとおりなのですが。 class Post < ApplicationRecord bel…
ajaxでHTMLをリクエストするタイプの設計のときに、メタ情報もうまく受け取りたい
Railsアプリケーションを書くときに、turbolinksやstimulusなど…
OmniAuthでログインを失敗したときのテストでエラーが出たときの対処法
OmniAuthを利用したログインのsystem specで、ログインに失敗し…
miuchee を heroku 環境に移行した
miuchee を heroku に移行したメモです。 移行理由 @mkouhei さ…
« 脆弱性情報をどこまでどうやって共有する… type="date"なフォームをcapybara+chrome… »