1

rspec ドキュメントを調べてみると、このページの生成セクションでこれらのコード行が見つかりましたhttp://rubydoc.info/gems/rspec-expectations/frames

yielding セクションのコードの各行が何をするのか、誰でも説明できますか

4

1 に答える 1

5

何をしexpect { |b| 5.tap(&b) }.to yield_controlますか?

ブロックで指定されたコードがyieldステートメントを呼び出すことを期待しています。

ブロック内のコード (つまり{ |b| 5.tap(&b) }) は、実装内にステートメント を持つruby​​ 1.9 の tap メソッドを呼び出します。yield

したがって、このステートメントは、ruby 1.9 の tap メソッドにステートメントがあることを効果的に主張していyieldます。:-)

このステートメントをよりよく理解するには、次のコード例を試してください。

order.rbファイル

class Order
end

order_spec.rbファイル

require 'rspec-expectations'
require './order'

describe Order do
  it "should yield regardless of yielded args" do
    expect { |b| 5.tap(&b);puts "The value of b is #{b.inspect}" }.to yield_control
  end
end 

仕様の実行からの出力:

$ rspec yield_spec.rb

Order
The value of b is #<RSpec::Matchers::BuiltIn::YieldProbe:0x000001008745f0 @used=true, @num_yields=1, @yielded_args=[[5]]>
  should yield regardless of yielded args

Finished in 0.01028 seconds
1 example, 0 failures

yielding セクションの他の行を理解するには、同様にexpect次のように仕様ファイルにステートメントを含めます。

 it "should yield with no args" do
    expect { |b| Order.yield_if_true(true, &b) }.to yield_with_no_args
  end 
      it "should yield with 5 args" do
    expect { |b| 5.tap(&b) }.to yield_with_args(5)
  end 

  it "should yield with integer args" do
    expect { |b| 5.tap(&b) }.to yield_with_args(Fixnum)
  end 

  it "should yield with string args" do        
    expect { |b| "a string".tap(&b) }.to yield_with_args(/str/)
  end 

  it "should yield 1,2,3 successively" do
    expect { |b| [1, 2, 3].each(&b) }.to yield_successive_args(1, 2, 3)
  end 

  it "should yield ([:a,1], [:b,2]) successively" do
    expect { |b| { :a => 1, :b => 2 }.each(&b) }.to yield_successive_args([:a, 1], [:b, 2]) 
  end 

注: yield_if_true2 行目に使用されているメソッドは、最初に定義された場所から削除されたようです。次のように Order クラスに追加することで、機能するようになりました。

class Order
  def self.yield_if_true(flag)
    yield if flag
  end
end
于 2012-11-23T18:48:09.413 に答える