RSpec3.1の主な変更点をまとめてみた
もう1週間経ってしまいましたがRSpec3.1がリリースされたので勉強がてら主な新機能・変更点をまとめてみました。
なお、この記事はMyron Marstonの記事の要約になっています。
Backtraceフィルタの変更
RSpec3.0では表示していなかったgemの中のbacktraceをデフォルトで表示するようになっています。
非表示にする場合は以下を設定します。
特定のgemのbacktraceを非表示にすることもできます。
–exclude-patternオプションの追加
$ rspec --pattern "spec/**/*_spec.rb" --exclude-pattern "spec/acceptance/**/*_spec.rb"
という感じで除外するspecファイルを指定できます。
Rakefileに書くとこうなります。
スタンドアロンでも設定なしで動く
RSpec3.0のデフォルト設定ではrspec-expectationやrspec-mocksがないとロード失敗でエラーになっていました。
RSpec3.1ではロードできなくてもエラーが起きないようになっていて、spec-coreだけで使いやすくなっています。
.rspecを–warningsフラグtrueで生成しない
RailsでWarningがたくさん出てしまうという理由で、Railsで.rspec
を自動生成した時の--warnings
のデフォルト値をtrue
にしないようになっています。
have_attributesマッチャの追加
オブジェクトのattributeテストを簡単に行えるhave_attributes
マッチャが追加されています。
このマッチャはan_object_having_attributes
にもエイリアスされていて
という使い方もできます。
メソッドへ渡るメッセージにも使えるようです。
Compoundマッチャをブロックでも利用可能
以下のように1つのブロックに対して複数のマッチャを続けて書くことができます。
define_negated_matcherの追加
例えばexclude
をinclude
の反対として定義できます。
こうすると
の代わりに
と書けるようになります。
この機能はCompoundマッチャと組み合わせると非常に便利です。
カスタムマッチャチェインをdescriptionにも出力
のようなカスタムマッチャがあった場合、RSpec3.0だとこのようなメッセージが出力されていました。
Failure/Error: expect(5).to be_smaller_than(10).and_bigger_than(7)
expected 5 to be smaller than 10
RSpec3.1では次のようになります。
Failure/Error: expect(5).to be_smaller_than(10).and_bigger_than(7)
expected 5 to be smaller than 10 and bigger than 7
ただし、この機能は後方互換のためにデフォルトoffになっているので
を設定する必要があります。
RSpec4からはデフォルトでonになるようです。
*_spyメソッドの追加
これまでdoubleを使う時にnil
を返すだけのメソッドでも
というようにメソッド名(:foo
)を2回書かなければいけませんでした。
RSpec3.1ではas_null_object
メソッドが追加されて
というようにメソッド名を1回だけ書けば済むようになっています。
また、as_null_object
をいちいち書かなくてもいいように下記のメソッドが用意されています。
and_wrap_originalの追加
and_wrap_original
を使うとテスト時にメソッドをラップできるようになります。
Rails4.2のサポート
Rails3.1は公式にRails4.2をサポートするとのことです。
rails_helper.rbではspec/supportを自動ロードしない
spec/support
を全てロードすると時間がかかるため、自動生成されたrails_helper.rb
ではspec/support
を自動ロードしないようになっています。
RSpec3.1では必要なファイルだけロードすることが推奨されています。
まとめ
以上、RSpec3.1の新機能の紹介でした。
個人的にはdefine_negated_matcher
が活躍してくれそうな気がしてます。