最近、私は「stubberry」と呼ばれるこの種のアサーションを緩和するための宝石を作成しました。
ここでは、それを使用して必要な動作を管理する方法を説明します。
まず、質問に答える必要があります。
テストシーケンスを実行する前に、元のオブジェクトにアクセスできますか?
確実に電話をかけることができる間接的な方法はありますか?つまり、アクセスできる他のオブジェクトに対していくつかのメソッド呼び出しがあるはずです。
メソッドを実際に呼び出す必要がありますか、それともprooperオブジェクトでスタブ化するか、呼び出し可能にすることができますか?
オブジェクトにアクセスでき、呼び出し可能オブジェクトを使用してメソッドをスタブできる場合:
obj.stub_must( :right, -> { stub_response } ) {
... do something
}
オブジェクトにアクセスできるが、メソッドをスタブ化せず、メソッドが呼び出されたことを確認したい場合は、次のようにします。
assert_method_called( obj, :right ) {
.... do something with obj
}
テストするオブジェクトにアクセスできない場合。ただし、他のオブジェクトメソッド呼び出しを使用して間接チェックを行うことができます。たとえば、「right」メソッドはAPI呼び出しの実行で終了します。
API.stub_must( :get, -> (path, params) {
assert_equal( path, :expected_path )
assert_equal( params, {} )
} ) do
... do something
end
間接的なチェックを行うことはできません。
stunt_boudle = Obj.new
stunt_boudle.stub_must( :right, -> () {
#do needed assertions
} ) do
Obj.stub_must(:new, stunt_boudle) do
# do some integration testing
end
end
# OR use assert_method_called the same way
また、idによるActiveRecordオブジェクトのスタブのクールなセットがあります。この場合、テストアクションの開始時にオブジェクトとそのActiveRecordオブジェクトにアクセスできないときにそれらを使用できます。