Effective Testing with RSpec 3を読んだ

Amazonレビュー的な何か

RSpec3自体の効果的な使い方が網羅的に紹介されている書籍です。

RSpecのバージョンは、3.6.0です

どのように、RSpecでテストを書いていくかという具体的なテスト方法に関する内容より、しっかり調べていないと使わないようなオプションや機能などが紹介されていて、学ぶの多い書籍です。

はじめに、書籍の読み方が紹介されています。全15章のうち6章までが基礎的な内容のためそこまでは読むといいようです。

実務において、APIのテストをする機会があり、効果的なMockやstubの使い方がわかりませんでした。むしろ、MockやStub、正直に言うと、Test Doubleに関するあらゆる知識がありませんでした。書籍では、最後の3章にてRSpec Mocksについて解説しています。

13、14章を読むとTest Doubleに関する全体像がぼんやりと見えてきます。しかし、これがRSpecに基づく知識なのか、他のテストツールと比べることで理解を深める必要があるでしょう。一旦は、満足する自分の中での説明ができるようになりました。

最後の15章は、より実践的なTest Doubleの使い方が紹介されています。

特に、Using Partial Doubles Effectively の節は心にグッサリとくるものがあります。 追加機能を作る時、テストを置き換える前に既存コードをリファクタリングすること視点を学ぶことができました。

本書は、RSpecを書き始めた全ての人に読んで欲しい本です。6章までは。

翻訳はされていませんが、かなりわかりやすい英語で書かれているので英語が苦手な人でも簡単に読むことができるでしょう。

学んだこと

  • filter_gems_from_backtraceでトレースするgemを制限できる

  • aggregate_failuresで、ブロックでまとめたテストが落ちても続けてブロック内を実行してくれる

  • --bisectオプションを付けることで、ランダムに失敗するspecの再現を最小のテスト構成を知ることができる

  • a_hash_including includeのalias。エラーメッセージが読みやすくなる。

RSpec Mocks

  • Stub I/Oなどを避けるために定型文を返す。

http_response = double(​'HTTPResponse'​, ​status: ​200, ​body: ​​'OK'​) がシンプルな書き方。

実務では、下記のように記載する。

http_response = double(​'HTTPResponse'​)
allow​(http_response).to receive_messages(​status: ​200, ​body: ​​'OK'​)
or
allow​(http_response).to receive(​:status​).and_return(200)
allow​(http_response).to receive(​:body​).and_return(​'OK'​)
  • Mock

テスト内で指定したメッセージを受け取らなければエラーを返す。

  • Spy

スタブやMockなどで実行する前に結果を明示するのは、やや違和感がある。

Spyを使うとテストコードを実行した後に、何が実行過程に起こったかを確認できる。

Spyを使う場合は、null objectかallowでメッセージを許可する必要がある。

  • PARTIAL DOUBLES

組み込みライブラリなどオブジェクトにスタブしたい時に使うdouble

  • VERIFYING DOUBLES

スタブやモックでは、仮の処理を許可しているため既存コードに変更があった場合、検知できない。

instance_double などを使うことで、メソッドなどに名前変更があった時にエラーを検知できるようになる。

  • STUBBED CONSTANTS

定数をスタブする。

hide_const(​'ActiveRecord'​) とすると、Active Recordを使わないようにできる。

  • withで引数を指定できる。

引数の名前にこだわらない場合は、anything を利用できる。

Effective Testing with RSpec 3: Build Ruby Apps with Confidence (English Edition)

Effective Testing with RSpec 3: Build Ruby Apps with Confidence (English Edition)