将ruby代码存储在let()变量中

时间:2015-07-23 13:52:36

标签: ruby rspec

我想存储的代码将在each_with_index块中运行:

describe '#each_with_index' do
  subject { [:a,:b].each_with_index{ block.to_ruby } }

  context 'when the block prints v to console' do
    let(:block) { '|v| puts v' }
    specify { expect { subject }.to output(':a :b').to_stdout }
  end

  context 'when the block prints i to console' do
    let(:block) { '|v,i| puts i' }
    specify { expect { subject }.to output('0 1').to_stdout }
  end

  context 'when the block prints v and i to console' do
    let(:block) { '|v,i| puts "#{v} and {i}"' }
    specify { expect { subject }.to output(':a and 0 :b and 1').to_stdout }
  end
end

我不需要将代码存储为字符串,这只是向您展示我的意思的一种方式。我想用块内代码,管道和一切来做这件事。我有一种感觉,我们可以使用Proc.new,但管道正在绊倒我。

1 个答案:

答案 0 :(得分:3)

类似的东西:

let(:block) { Proc.new{ |v| puts v } }
subject { [:a,:b].each_with_index { |*args| block.call args } }