4

コードのブロックを引数として取るメソッドがあります。問題は、このメソッドがブロックを呼び出した場合にRSpecを使用してテストする方法です。

ブロックは、メソッドが必要とする任意のスコープで評価できますが、必ずしもyieldまたはを使用する必要はありませんblock.call。別のクラスに渡されるか、匿名クラスオブジェクトまたは他の場所で評価されます。テストに合格するには、メソッド呼び出しの結果としてどこかでブロックを評価するだけで十分です。

RSpecを使用してこのようなものをテストする方法はありますか?


とモックのより複雑なケースについては、これも参照してください。lets

4

3 に答える 3

3

任意のレスキューハンドラーでレスキューできないので、この種の問題のthrow代わりに使用するのが好きです。raiseしたがって、次のようになります。

my_proc = proc { throw :my_proc_was_called }
expect {
  my_proc.call
}.to throw_symbol :my_proc_was_called
于 2014-08-23T15:07:55.287 に答える
2

私は通常次のようなことをします

a = 1
b.go { a = 2}
a.should == 2
于 2012-11-06T17:07:50.303 に答える
1

上記のコメントでのDaveNewtonの提案のおかげで、私は次のようなことをしました。

 it "should run block defining the node" do
   message="This message is raised if block is properly evaluated."
   expect do
     node do
       raise message
     end 
   end.to raise_error message
 end

エラーの場合、これはメッセージを出力します:

 Failure/Error: expect do
   expected Exception with "This message is raised if block is properly evaluated." but nothing was raised

これは私が十分に有益だと思います。

助けてくれてありがとう!

于 2012-11-06T15:06:58.493 に答える