2017-08-17 2 views
0

Rubyのyieldメソッドにブロックを渡すたびに、ブロックが実際に実行されたかどうかを知りたいと思います。例えば:ブロック実行のruby yieldメソッドのテスト

def yield_method(list) 
    list.each do |item| 
    yield item 
    end 
end 

yield_method(ARGV) { |item| 
    print item 
} 

print "executed" 

私は降伏メソッドに渡されたブロックは、あなたは、変数を初期化する必要があるとしている

+0

この場合、ブロックが呼び出されたことを既に知っています。そうでなければ、LocalJumpError( "No Block Given")があります。あなたが 'yield(item)if block_given?'を使ったのであれば、それは別の話になります。 –

+0

@maxpleaner 'yield'は' list'が空であれば呼び出されません。 – tadman

+0

おそらく[これらのRspecテスト](https://relishapp.com/rspec/rspec-expectations/docs/built-in-matchers/yield-matchers)を使用することができます。 –

答えて

3

を実行された場合にのみ実行するように

print "executed" 

for文たいですブロックの外側に配置し、ブロック内から設定してからテストします。

executed = false 
yield_method(ARGV) do |item| 
    executed = true 
    # whatever else 
end 
print "executed" if executed 

それとも、実行されるブロックのための条件が満たされたかどうかに基づいて値を返すようにyield_methodを変更することができます:ブロックかどうかを知る必要、と述べ

def yield_method(list) 
    list.each do |item| 
    yield item 
    end 
    list.any? 
end 

executed = yield_method(ARGV) { ... } 
print "executed" if executed 

私に悪臭を覚えました - 代わりにブロックを実行させる条件をテストして(第2の形式のように)、意味的にコードを書いてそのことを意味するようにします。例:

これは、この場合、一部のブロックが呼び出されたかどうかではなく、処理するargがあるかどうかを気にしていることを反映しています。ブロックに気になる副作用がある場合は、ブロック実行に基づいていると仮定するのではなく、その副作用を直接テストする必要があります。

+0

ああ、これはまさに私が探していたものです。ありがとう! – Chancelot

関連する問題