RSpec 1.3でカスタムマッチャ

ある処理で行われるファイルの移動が適切かどうかテストしたかったので、カスタムマッチャを作ってみた。使用したのはRSpec 1.3.1。

目標のspec

lambda { foo }.should move_file(src, dest)

チェックする項目

  1. fooメソッドを実行する前にsrcにファイルが存在することをチェック(事前チェック)
  2. Foo#barを実行した後にsrcにファイルが存在しないことをチェック(事後チェック)
  3. Foo#barを実行した後にdestにファイルが存在することをチェック(事後チェック)
  4. srcとdestのMD5値が一致することをチェック(事後チェック)

(1は要らないかも?)

実際のコード

CustomFileMatchers::MoveFileのmatches?で具体的なテストを実行する。

使い方

describe文のなかでincludeして使う。 ためしにちゃんと判定できているかもspecで書いてみた。 (it文の内容が微妙かもしれない)

まとめ

意外と簡単にできたし、specのコードがコンパクトかつそれだけで意味が通じるようになるのでカスタムマッチャはとても便利。

複数のチェック項目が通って一つの意味を成す場合にとても強力。

change.from.toのように条件の追加をメソッドチェインしたければCustomFileMatchers::MoveFileに引数をインスタンス変数に保存するようなメソッド(changeでいうところのfromやto)を追加して、matches?でそれらをチェックすればいいのだと思われる。

参考資料