「プロを目指す人のためのRuby入門[改訂2版]」と「Everyday Rails - RSpecによるRailsテスト入門」を読んで学んだこと
Rubyに関係する技術書を2冊読んだので、学んだことや感想を書いていきます! gihyo.jp leanpub.com
読んだ理由
一番の理由は、今後Rubyで作られているプロダクトに携わるためです。その上で、 Rubyのテストコードで多く使用されているRSpecを知り、何をどのようにテストするのか学びたかったので、上の技術書を読んでみました。
学びを得たこと
プロを目指す人のためのRuby入門[改訂2版]
Rubyの特徴
- falseもnilも偽扱いとなる
- if文もメソッドも最後に評価された式が戻り値となる
- !がついていれば破壊的メソッドだが、ついていなくても破壊的メソッドの可能性もある
- &.演算子:オブジェクトがnilだったらnilを返してくれる。エラーを防ぐためのif文を書かなくて済むメリットがある。
Bashと似ている部分
- シングルクォーテーションとダブルクォーテーションの違い
- ダブルクォーテーションは変数展開できる
- ヒアドキュメント
- Bashと違って、
<<-
指定することで半角スペースでインデントできる。
- Bashと違って、
シンボル
- Stringクラスのオブジェクトとシンボルはよく似ている。文字列を扱うもの。
- 文字列を扱う際にStringクラスのオブジェクトでなくて良いならば、積極的にシンボルを使うこと
- 内部的に整数として管理されるので高速に比較できる。
- シンボルはイミュータブル
- 文字列とシンボルの変換は、
to_sym
やto_s
オブジェクト指向
- Rubyは単一継承
- privateなメソッドは、そのクラス自身とサブクラスでも呼び出せる
- protectedなメソッドは、そのクラス自身とサブクラスインスタンスメソッドから、レシーバ付きで呼び出せる
- インスタンス変数=クラスをインスタンス化した際にオブジェクトごとに管理される変数
- クラスインスタンス変数=クラス自身が保持している変数
- クラス変数=クラスインスタンス変数と違い、スーパークラスとサブクラス間で共有する変数
- クラスメソッド=特異メソッド
モジュール
include
:継承を使わず、多重継承のようにクラスにインスタンスメソッドの追加/上書きすることをミックスインという。entend
:複数のクラスに対して共通の特異メソッドを追加する。module_function
:ミックスインとしても特異メソッドとしても呼び出し可能とする。- 名前空間の用途としても使える。
例外処理
- Rubyでの
begin...rescue...ensure
は、 他言語でのtry...catch...finally
resucue
内でretry
があると処理をやり直せる
Procオブジェクト
- JavaScriptの関数オブジェクトみたいなもの
- Procオブジェクトとlambdaはほとんど同じ
- 前者は定義している引数と違う数の引数を指定してもエラーとならず柔軟性がある。後者定義している引数の数に過不足があるとエラーとなる。
パターンマッチ
case...in...
評価したい式 in パターン
ot式 => パターン
でも1行パターンマッチができる- 様々なパターンに該当するものを取得する
その他
- DateTimeクラスは非推奨
- deprecatedオプションまたは、
WANING[:deprecated] = true
を設定すると非推奨機能使った際に表示してくれる
Everyday Rails - RSpecによるRailsテスト入門
- バリデーションのエクスペクテーションは、
Shoulda Matchers
を使うと1行で終わる - RSpecはデフォルトでデータベースの後片付けをやってくれる
- describeとcontextの使い分けの例
describe ではクラスやシステムの機能に関するアウトラインを記述し、context では特定の状態に関するアウトラインを記述するようにします。
let
:遅延評価、必要となった際にブロックの処理が呼び出され、変数が使用可能となる。- スタブに関して、できるかぎり検証機能付きのテストダブル(
instance_double
)を使うこと
モデルスペック
- モデルスペックは、example(itで始まる1行)1つにつき、エクスペクテーションは1つだけ。exampleが失敗したときに問題が起きたバリデーションを特定できる。
- Modelで作成しているコードの中に、真偽値を返す自作メソッドがあれば、
be_自作メソッド名
でアサーションしてくれる
わかっていないこと
- 事前に変数に定義しておく場合においてのletとbeforeの使い分け、変数参照時にデータを作ることで賄えるか、予め絶対変数にデータが入っている必要があるかどうかとか?
- let!の使いどころはよくわからず...
感想
「プロを目指す人のためのRuby入門[改訂2版]」について、分厚いけどわかりやすく読みやすい本でした!ぼっち演算子の説明画像が個人的に好きでした。約3年前、Rubyのことよく理解せずにRailsだけやってて、Ruby基本的な考え方を知れてよかった。今思うのは、昔から読んでおけばよかったと思います。 「Everyday Rails - RSpecによるRailsテスト入門」について、これも約3年前に買うだけ買って全然読んでなく、今回初めて読み終えました。実際にサンプルコードを書きながらやったので、理解が深まったと思います。Factory Botについて、きっと便利だとは思うのですが、仕様をよく理解しないと想定外のテストデータが作れられる可能性がありそうなので、気を付けます。 RubyとRSpecの基礎を学べたので基本的な部分は一人で作成できるはず...!