Created
July 29, 2012 08:56
-
-
Save kyo-ago/3196824 to your computer and use it in GitHub Desktop.
SinonJSに登場する各種Objectの解説
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 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