Skip to content

Instantly share code, notes, and snippets.

@kyo-ago
Created July 29, 2012 08:56
Show Gist options
  • Save kyo-ago/3196824 to your computer and use it in GitHub Desktop.
Save kyo-ago/3196824 to your computer and use it in GitHub Desktop.
SinonJSに登場する各種Objectの解説
# SinonJSに登場する各種Objectの解説
1. spy
spy methodは渡されたfunctionの動作を生かしつつ、呼び出し時の状態を保持するfunctionへ差し替えます。
spyされたfunctionは呼び出し毎にthis, arguments, return(もしあればthrow)の値がspyCall objectとして保持され、あとからその内容を元にassertを行うことができます。
1. stub
stub methodは渡されたfunctionを空のspy functionに置き換えます。
stub化されたfunctionはspy functionのすべての実装を継承し、さらにfunctionの動作を置き換えるmethodが追加されます。
1. mock
mock methodは渡されたfunctionを別の動作を行うfunctionに置き換えます。
mock化されたfunctionはstub function、spy functionのすべての実装を継承し、さらにfunctionの動作を置き換えるmethodが追加されます。
1. stub, mockの使い分け
mockで大きなobject等のmethodを監視しつつ、細か部分のmethodをその都度stubで潰していくのがいいと思います。
具体的にはsetUpで動きを定義し、test method内では直接そのobjectの結果を監視しないようなobjectの場合mockを使うといいでしょう。
ただ、使い分けが不明であれば無理に使う必要もないので、最初はstubだけを使うほうがいいと思います。
(stubのみでもそこまで困らないです)
1. 各objectの概要
それぞれのobjectは以下のような関係を持ちます。
* mock object
mock methodでwrapされたfunction
「そのfunctionはどう呼び出されるべきか」を表す
* stub object
stub methodでwrapされたfunction
「一時的に何もしないfunction」を表す
* spy object
spy methodでwrapされたfunction
「動きはそのままで動作を監視されるfunction」を表す
* call object
spy methodでwrapされたfunctionが呼び出された時に生成されるobject
「functionが呼び出された時の入出力内容」を表す
stub, mockはspyと同じmethodが使えるため、stub, mock objectの呼び出し時にもcall objectは生成されます。
call objectは「spy objectが呼び出された時の状態」のみを保持するため、各呼び出しの前後関係や、呼び出し回数はspy objectが保持します。
1. 各methodの命名規則
各methodは以下の様な命名規則を持ちます。
calledWithでargment経由の指定、calledOnでthis経由の指定、alwaysがつくと「全呼び出しでそうか」、Exactlyがつくと「全部一致するか」の指定、Matchがつくと引数がmatch objectで書かれていると想定、notがつくと「指定引数で一致しない引数で呼び出されたことがある場合」、neverがつくと「すべての呼び出しが指定引数と一致しなかった場合」、threwがつくと「spy中のfunctionがthrowしたことがある場合」、returnedがつくと「spy中のfunctionが指定返り値を返したことがある場合」みたいなことを分けて書く
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment