😸
Rails学習
- modelsのconcerns:共通部分をまとめる
- https://lanlib.com/2021/04/04/rails-concernの使い方/
- module作成してクラス内でincludeして読み込む
- 単一責任のクラスを作る:複数の役割を持たせない
- 共通処理はモジュールにする
- returnはできるだけ書かない
- https://github.com/kure-kosen/QnA-Issues/issues/4
- 早期returnで利用する程度
- return書かないのに違和感ありましたが慣れたい
- moduleのメリット
- メソッドや定数を一箇所にまとめて整理しておくことができる。
- クラスで読み込むこと(Mix-in)ができ、多重継承が実現できる。
- 名前空間を分けて、メソッド名の重複を防げる。
- https://26gram.com/ruby-module
- 特異メソッド:オブジェクトに対して直接固有のメソッドを定義することができる
- moduleのselfって何?
- モジュールの外からメソッドを直接呼び出すことができるようになる
- 変数
- インスタンス変数(@で始まる変数)
- クラスから生成されたオブジェクトがインスタンス
- initializeメソッドとオブジェクトのインスタンスメソッドのみアクセス可
- インスタンス変数を外から呼ぶ場合getter/setter要(attr_accessorを利用)
- インスタンス変数はprivate扱いとなる
- クラス変数(@@で始まる変数)
- クラスの特異メソッド、インスタンスメソッドなどから参照/代入ができる
- サブクラスから参照/代入が可能
- インスタンス変数(@で始まる変数)
- 定数:https://moonstruckdrops.github.io/blog/2014/03/23/rails-consts/
- freezeつける(rubocopで自動整形できるので自分で書かなくてもいい)
- アノテーション
- TODO:後日追加が必要な、不足の機能
- FIXME:修正の必要な箇所
- OPTIMIZE:パフォーマンス低下の原因となる箇所
- HACK:リファクタリングの必要なマズいコード
- REVIEW:意図したとおりに動くかどうかチェックが必要
- rspec
- allow_any_instance_of:オブジェクトのローカル変数など、簡単にモックにできない場所に利用
- 非推奨ではある
- https://dev.classmethod.jp/articles/rspec-recipe
- be_truthy:
- Rubyの真偽値の評価:false または nil であれば偽、それ以外は全て真
- https://qiita.com/jnchito/items/2e79a1abe7cd8214caa5
- rspecスタイルガイド:https://github.com/willnet/rspec-style-guide
- before
- before(:all) が実行されるのは最初の 1 回だけ。
- before(:each) が実行されるのは各 it ごと
- :all,:eachが未指定の場合は「each」と同じ挙動をする
- Rakeタスク
- 薄いグルーコードにする(具体的な処理は持たず呼び出すだけ)
- 細かいロジックを別のクラスやモジュールに記述し、Rakeタスク自体は、CLIとのI/Fであったり、実行フローの管理の責務のみをもたせる
- https://qiita.com/aeroastro/items/c97bd26ce8b8818b6bed
- rakeタスクの呼び出し
- Rake::Task['with:args'].invoke("pizza")
- 複数回タスクを呼び出したい場合は「Rake::Task#reenable」の実行要
- environmentメソッド
- タスクの処理をアプリケーション環境に依存させた上で実行する
- Rails上に設定したモデルの情報を取り扱うことが可能となる
- モック
- described_class:テストコードを書くモデルを直接対象としている
- モック
- 空のモックオブジェクトを作る:twitter_client_mock = double('Twitter client')
- doubleの引数は任意(エラー時に表示されるのでわかりやすい名前をつける)
- allow(実装を置き換えたいオブジェクト).to receive(置き換えたいメソッド名).and_return(返却したい値やオブジェクト)
- 空のモックオブジェクトを作る:twitter_client_mock = double('Twitter client')
- なるべくsubjectは使わない方がいい
- https://blog.jnito.com/entry/2021/10/09/105651
- subjectの使いどころ = メソッドの戻り値をテストするケース
- subjectが向いていないケース = メソッドの副作用をテストするケース
- 乱数のテスト
- https://discourse.clean-rails.org/t/clean-test-code-revised/259/7
- https://konyu.hatenablog.com/entry/2020/06/04/171807
- spec_helperの「Kernel.srand config.seed」のコメントを外す
- rspecの実行コマンドに 「--seed」を指定して乱数を固定
- rspec spec --seed 1
- 何で固定されるかは一度実行して確認する(seedの仕組みがよくわかってない)
Discussion